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

創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接,廣告投放平臺(tái)為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
提示
空接口類型類似于 C# 或 Java 語言中的 Object、C語言中的 void*、 C++ 中的 std::any。在泛型和模板出現(xiàn)前,空接口是一種非常靈活的數(shù)據(jù)抽象保存和使用的方法。
空接口的內(nèi)部實(shí)現(xiàn)保存了對(duì)象的類型和指針。使用空接口保存一個(gè)數(shù)據(jù)的過程會(huì)比直接用數(shù)據(jù)對(duì)應(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
對(duì)代碼的說明:
- 第 1 行,聲明 any 為 interface{} 類型的變量。
- 第 3 行,為 any 賦值一個(gè)整型 1。
- 第 4 行,打印 any 的值,提供給 fmt.Println 的類型依然是 interface{}。
- 第 6 行,為 any 賦值一個(gè)字符串 hello。此時(shí) any 內(nèi)部保存了一個(gè)字符串。但類型依然是 interface{}。
- 第 9 行,賦值布爾值。
從空接口獲取值
保存到空接口的值,如果直接取出指定類型的值時(shí),會(huì)發(fā)生編譯錯(cuò)誤,代碼如下:
// 聲明a變量, 類型int, 初始值為1
var a int = 1
// 聲明i變量, 類型為interface{}, 初始值為a, 此時(shí)i的值變?yōu)?
var i interface{} = a
// 聲明b變量, 嘗試賦值i
var b int = i第8行代碼編譯報(bào)錯(cuò):
cannot use i (type interface {}) as type int in assignment: need type assertion
編譯器告訴我們,不能將i變量視為int類型賦值給b。
在代碼第 15 行中,將 a 的值賦值給 i 時(shí),雖然 i 在賦值完成后的內(nèi)部值為 int,但 i 還是一個(gè) interface{} 類型的變量。類似于無論集裝箱裝的是茶葉還是煙草,集裝箱依然是金屬做的,不會(huì)因?yàn)樗b物的類型改變而改變。
為了讓第 8 行的操作能夠完成,編譯器提示我們得使用 type assertion,意思就是類型斷言。
使用類型斷言修改第 8 行代碼如下:
var b int = i.(int)
修改后,代碼可以編譯通過,并且 b 可以獲得 i 變量保存的 a 變量的值:1。
空接口的值比較
空接口在保存不同的值后,可以和其他變量值一樣使用
==進(jìn)行比較操作??战涌诘谋容^有以下幾種特性。
1) 類型不同的空接口間的比較結(jié)果不相同
保存有類型不同的值的空接口進(jìn)行比較時(shí),Go語言會(huì)優(yōu)先比較值的類型。因此類型不同,比較結(jié)果也是不相同的,代碼如下:
// a保存整型
var a interface{} = 100
// b保存字符串
var b interface{} = "hi"
// 兩個(gè)空接口不相等
fmt.Println(a == b)代碼輸出如下:
false
2) 不能比較空接口中的動(dòng)態(tài)值
當(dāng)接口中保存有動(dòng)態(tài)類型的值時(shí),運(yùn)行時(shí)將觸發(fā)錯(cuò)誤,代碼如下:
// c保存包含10的整型切片
var c interface{} = []int{10}
// d保存包含20的整型切片
var d interface{} = []int{20}
// 這里會(huì)發(fā)生崩潰
fmt.Println(c == d)代碼運(yùn)行到第8行時(shí)發(fā)生崩潰:
panic: runtime error: comparing uncomparable type []int
這是一個(gè)運(yùn)行時(shí)錯(cuò)誤,提示 []int 是不可比較的類型。下表中列舉出了類型及比較的幾種情況。
| 類 型 | 說 明 |
|---|---|
| map | 宕機(jī)錯(cuò)誤,不可比較 |
| 切片([]T) | 宕機(jī)錯(cuò)誤,不可比較 |
| 通道(channel) | 可比較,必須由同一個(gè) make 生成,也就是同一個(gè)通道才會(huì)是 true,否則為 false |
| 數(shù)組([容量]T) | 可比較,編譯期知道兩個(gè)數(shù)組是否一致 |
| 結(jié)構(gòu)體 | 可比較,可以逐個(gè)比較結(jié)構(gòu)體的值 |
| 函數(shù) | 可比較 |
文章標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語言空接口類型(interface{})
轉(zhuǎn)載注明:http://www.fisionsoft.com.cn/article/cdjiiij.html


咨詢
建站咨詢
