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

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

新聞中心

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

空接口是接口類型的特殊形式,空接口沒有任何方法,因此任何類型都無須實(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ù) 可比較

名稱欄目:創(chuàng)新互聯(lián)GO教程:Go語言空接口類型(interface{})
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/cdjiiij.html