淺談golang類(lèi)型斷言,失敗類(lèi)型斷言返回值問(wèn)題
失敗的類(lèi)型斷言,返回的值為最近斷言類(lèi)型的零值
代碼入下:
func main() {
var data interface{} = "ehoo"
if res, ok := data.(int); ok {
fmt.Printf("int res:%d\n", res)
} else if res, ok := data.(bool); ok {
fmt.Printf("bool res:%b\n", res)
} else {
fmt.Printf("other res:%v\n", res) // 斷言類(lèi)型的零值,結(jié)果:false
}
}
補(bǔ)充:go語(yǔ)言interface{}類(lèi)型斷言的舉例使用
在go語(yǔ)言里經(jīng)常會(huì)用到interface{}類(lèi)型,它是類(lèi)似于c語(yǔ)言中的void *類(lèi)型,可以接受任意類(lèi)型的參數(shù)。當(dāng)我們的函數(shù)或者方法中有該參數(shù)時(shí),要判斷具體的類(lèi)型值再進(jìn)行相應(yīng)處理。
一般格式:返回值,bool變量:=interface{}變量.(要判斷的具體類(lèi)型),這樣就是以某個(gè)具體類(lèi)型來(lái)斷言,返回值就是這個(gè)具體類(lèi)型的。
比如:v,b:=a.(string),這個(gè)就是假設(shè)a這個(gè)interface{}變量是string類(lèi)型,而v這個(gè)返回值就是string類(lèi)型的變量,至于是否假設(shè)成功,就看b是true或者false。
這樣,如要判斷多個(gè)類(lèi)型的話(huà),就要分別寫(xiě)多個(gè)語(yǔ)句,v,b:=a.(string),v1,b1:=a.(int),v2,b2:=a.(float64)...因?yàn)槊看蔚姆祷刂祐,v1,v2是不同的預(yù)言類(lèi)型數(shù)值,有點(diǎn)麻煩。
而用switch .(type) case這樣語(yǔ)句,就省事多了,格式為:返回值:=interface{}變量.(type) case 具體某一類(lèi)型: case 具體某一類(lèi)型: ......
type Student struct {
m_Addr string
m_ID int
}
func (stu *Student) SetAddr(addr interface{}) (bool, error) {
//這樣寫(xiě)法:返回值,bool變量:=interface{}變量.(要判斷的具體類(lèi)型),就是判斷是否為指定類(lèi)型的值。
v, b := addr.(string) //這樣就是斷言v是string類(lèi)型的變量,只能賦值給同類(lèi)型的數(shù)值。
if b { //如是上邊要判斷的string類(lèi)型,這里會(huì)返回true
stu.m_Addr = v
return true, nil
} else { //如不是判斷的string類(lèi)型,會(huì)返回false,下面會(huì)返回錯(cuò)誤信息
return false, fmt.Errorf("不是string類(lèi)型")
}
}
func (stu *Student) SetStu(data ...interface{}) (bool, error) {
for _, d := range data { //循環(huán)遍歷參數(shù)列表,忽略第一個(gè)參數(shù)索引
/*這種寫(xiě)法是一個(gè)一個(gè)類(lèi)型判斷,在判斷多個(gè)類(lèi)型時(shí),比較麻煩,使用下面switch case就簡(jiǎn)便多了
var v, b = d.(string)
if b {
stu.m_Addr = v
}
var v1, b1 = d.(int)
if b1 {
stu.m_ID = v1
}
*/
switch v := d.(type) { //傳遞type類(lèi)型,只能在switch case語(yǔ)句使用,返回的v就是具體的值。
case int: //在每一個(gè)case判斷具體類(lèi)型,并對(duì)返回值v進(jìn)行處理
stu.m_ID = v
case string:
stu.m_Addr = v
}
}
return true, nil
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
go獲取協(xié)程(goroutine)號(hào)的實(shí)例
這篇文章主要介紹了go獲取協(xié)程(goroutine)號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言中的init函數(shù)特點(diǎn)及用法詳解
在Go語(yǔ)言中,init()函數(shù)是一種特殊的函數(shù),用于在程序啟動(dòng)時(shí)自動(dòng)執(zhí)行一次。它的存在為我們提供了一種機(jī)制,可以在程序啟動(dòng)時(shí)進(jìn)行一些必要的初始化操作,為程序的正常運(yùn)行做好準(zhǔn)備,在這篇文章中,我們將詳細(xì)探討init()函數(shù)的特點(diǎn)、用途和注意事項(xiàng)2023-06-06
Golang實(shí)現(xiàn)http server提供壓縮文件下載功能
這篇文章主要介紹了Golang實(shí)現(xiàn)http server提供壓縮文件下載功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Go語(yǔ)言通過(guò)Luhn算法驗(yàn)證信用卡卡號(hào)是否有效的方法
這篇文章主要介紹了Go語(yǔ)言通過(guò)Luhn算法驗(yàn)證信用卡卡號(hào)是否有效的方法,實(shí)例分析了Luhn算法的原理與驗(yàn)證卡號(hào)的使用技巧,需要的朋友可以參考下2015-03-03
Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解
這篇文章主要介紹了Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言與其他語(yǔ)言進(jìn)行交互的方式詳解
在當(dāng)今的軟件開(kāi)發(fā)領(lǐng)域,多種編程語(yǔ)言常常需要協(xié)同工作,以充分利用各自的優(yōu)勢(shì)來(lái)構(gòu)建復(fù)雜的應(yīng)用系統(tǒng),Go 語(yǔ)言作為一門(mén)高效、簡(jiǎn)潔的編程語(yǔ)言,也經(jīng)常需要與其他語(yǔ)言進(jìn)行交互,接下來(lái),我們將詳細(xì)探討 Go 語(yǔ)言如何與其他語(yǔ)言進(jìn)行交互,需要的朋友可以參考下2024-06-06
Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03
詳解Go語(yǔ)言中自定義結(jié)構(gòu)體能作為map的key嗎
在Go中,引用類(lèi)型具有動(dòng)態(tài)的特性,可能會(huì)被修改或指向新的數(shù)據(jù),這就引發(fā)了一個(gè)問(wèn)題—能否將包含引用類(lèi)型的自定義結(jié)構(gòu)體作為map的鍵呢,本文就來(lái)和大家想想講講2023-06-06

