日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言空接口類型(interface{})

空接口是接口類型的特殊形式,空接口沒有任何方法,因此任何類型都無須實現(xiàn)空接口。從實現(xiàn)的角度看,任何值都滿足這個接口的需求。因此空接口類型可以保存任何值,也可以從空接口中取出原值。

創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接,廣告投放平臺為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

提示

空接口類型類似于 C# 或 Java 語言中的 Object、C語言中的 void*、 C++ 中的 std::any。在泛型和模板出現(xiàn)前,空接口是一種非常靈活的數(shù)據(jù)抽象保存和使用的方法。

空接口的內(nèi)部實現(xiàn)保存了對象的類型和指針。使用空接口保存一個數(shù)據(jù)的過程會比直接用數(shù)據(jù)對應(yīng)類型的變量保存稍慢。因此在開發(fā)中,應(yīng)在需要的地方使用空接口,而不是在所有地方使用空接口。

將值保存到空接口

空接口的賦值如下:

var any interface{}

any = 1
fmt.Println(any)

any = "hello"
fmt.Println(any)

any = false
fmt.Println(any)

代碼輸出如下:

1
hello
false

對代碼的說明:

  • 第 1 行,聲明 any 為 interface{} 類型的變量。
  • 第 3 行,為 any 賦值一個整型 1。
  • 第 4 行,打印 any 的值,提供給 fmt.Println 的類型依然是 interface{}。
  • 第 6 行,為 any 賦值一個字符串 hello。此時 any 內(nèi)部保存了一個字符串。但類型依然是 interface{}。
  • 第 9 行,賦值布爾值。

從空接口獲取值

保存到空接口的值,如果直接取出指定類型的值時,會發(fā)生編譯錯誤,代碼如下:

// 聲明a變量, 類型int, 初始值為1
var a int = 1

// 聲明i變量, 類型為interface{}, 初始值為a, 此時i的值變?yōu)?
var i interface{} = a

// 聲明b變量, 嘗試賦值i
var b int = i

第8行代碼編譯報錯:

cannot use i (type interface {}) as type int in assignment: need type assertion

編譯器告訴我們,不能將i變量視為int類型賦值給b。

在代碼第 15 行中,將 a 的值賦值給 i 時,雖然 i 在賦值完成后的內(nèi)部值為 int,但 i 還是一個 interface{} 類型的變量。類似于無論集裝箱裝的是茶葉還是煙草,集裝箱依然是金屬做的,不會因為所裝物的類型改變而改變。

為了讓第 8 行的操作能夠完成,編譯器提示我們得使用 type assertion,意思就是類型斷言。

使用類型斷言修改第 8 行代碼如下:

var b int = i.(int)

修改后,代碼可以編譯通過,并且 b 可以獲得 i 變量保存的 a 變量的值:1。

空接口的值比較

空接口在保存不同的值后,可以和其他變量值一樣使用
==進行比較操作。空接口的比較有以下幾種特性。

1) 類型不同的空接口間的比較結(jié)果不相同

保存有類型不同的值的空接口進行比較時,Go語言會優(yōu)先比較值的類型。因此類型不同,比較結(jié)果也是不相同的,代碼如下:

// a保存整型
var a interface{} = 100

// b保存字符串
var b interface{} = "hi"

// 兩個空接口不相等
fmt.Println(a == b)

代碼輸出如下:

false

2) 不能比較空接口中的動態(tài)值

當(dāng)接口中保存有動態(tài)類型的值時,運行時將觸發(fā)錯誤,代碼如下:

// c保存包含10的整型切片
var c interface{} = []int{10}

// d保存包含20的整型切片
var d interface{} = []int{20}

// 這里會發(fā)生崩潰
fmt.Println(c == d)

代碼運行到第8行時發(fā)生崩潰:

panic: runtime error: comparing uncomparable type []int

這是一個運行時錯誤,提示 []int 是不可比較的類型。下表中列舉出了類型及比較的幾種情況。

類型的可比較性

類  型 說  明
map 宕機錯誤,不可比較
切片([]T) 宕機錯誤,不可比較
通道(channel) 可比較,必須由同一個 make 生成,也就是同一個通道才會是 true,否則為 false
數(shù)組([容量]T) 可比較,編譯期知道兩個數(shù)組是否一致
結(jié)構(gòu)體 可比較,可以逐個比較結(jié)構(gòu)體的值
函數(shù) 可比較

分享題目:創(chuàng)新互聯(lián)GO教程:Go語言空接口類型(interface{})
本文路徑:http://www.5511xx.com/article/cdjiiij.html