淺談golang類型斷言,失敗類型斷言返回值問(wèn)題
失敗的類型斷言,返回的值為最近斷言類型的零值
代碼入下:
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) // 斷言類型的零值,結(jié)果:false } }
補(bǔ)充:go語(yǔ)言interface{}類型斷言的舉例使用
在go語(yǔ)言里經(jīng)常會(huì)用到interface{}類型,它是類似于c語(yǔ)言中的void *類型,可以接受任意類型的參數(shù)。當(dāng)我們的函數(shù)或者方法中有該參數(shù)時(shí),要判斷具體的類型值再進(jìn)行相應(yīng)處理。
一般格式:返回值,bool變量:=interface{}變量.(要判斷的具體類型),這樣就是以某個(gè)具體類型來(lái)斷言,返回值就是這個(gè)具體類型的。
比如:v,b:=a.(string),這個(gè)就是假設(shè)a這個(gè)interface{}變量是string類型,而v這個(gè)返回值就是string類型的變量,至于是否假設(shè)成功,就看b是true或者false。
這樣,如要判斷多個(gè)類型的話,就要分別寫多個(gè)語(yǔ)句,v,b:=a.(string),v1,b1:=a.(int),v2,b2:=a.(float64)...因?yàn)槊看蔚姆祷刂祐,v1,v2是不同的預(yù)言類型數(shù)值,有點(diǎn)麻煩。
而用switch .(type) case這樣語(yǔ)句,就省事多了,格式為:返回值:=interface{}變量.(type) case 具體某一類型: case 具體某一類型: ......
type Student struct { m_Addr string m_ID int } func (stu *Student) SetAddr(addr interface{}) (bool, error) { //這樣寫法:返回值,bool變量:=interface{}變量.(要判斷的具體類型),就是判斷是否為指定類型的值。 v, b := addr.(string) //這樣就是斷言v是string類型的變量,只能賦值給同類型的數(shù)值。 if b { //如是上邊要判斷的string類型,這里會(huì)返回true stu.m_Addr = v return true, nil } else { //如不是判斷的string類型,會(huì)返回false,下面會(huì)返回錯(cuò)誤信息 return false, fmt.Errorf("不是string類型") } } func (stu *Student) SetStu(data ...interface{}) (bool, error) { for _, d := range data { //循環(huán)遍歷參數(shù)列表,忽略第一個(gè)參數(shù)索引 /*這種寫法是一個(gè)一個(gè)類型判斷,在判斷多個(gè)類型時(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類型,只能在switch case語(yǔ)句使用,返回的v就是具體的值。 case int: //在每一個(gè)case判斷具體類型,并對(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-12Go語(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-06Golang實(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-01Go語(yǔ)言通過(guò)Luhn算法驗(yàn)證信用卡卡號(hào)是否有效的方法
這篇文章主要介紹了Go語(yǔ)言通過(guò)Luhn算法驗(yàn)證信用卡卡號(hào)是否有效的方法,實(shí)例分析了Luhn算法的原理與驗(yàn)證卡號(hào)的使用技巧,需要的朋友可以參考下2015-03-03Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解
這篇文章主要介紹了Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Go語(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ǔ)言作為一門高效、簡(jiǎn)潔的編程語(yǔ)言,也經(jīng)常需要與其他語(yǔ)言進(jìn)行交互,接下來(lái),我們將詳細(xì)探討 Go 語(yǔ)言如何與其他語(yǔ)言進(jìn)行交互,需要的朋友可以參考下2024-06-06Go實(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中,引用類型具有動(dòng)態(tài)的特性,可能會(huì)被修改或指向新的數(shù)據(jù),這就引發(fā)了一個(gè)問(wèn)題—能否將包含引用類型的自定義結(jié)構(gòu)體作為map的鍵呢,本文就來(lái)和大家想想講講2023-06-06