淺談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è)類型的話,就要分別寫(xiě)多個(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) {
//這樣寫(xiě)法:返回值,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ù)索引
/*這種寫(xiě)法是一個(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中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出
本文主要介紹了go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Go語(yǔ)言循環(huán)遍歷含有中文的字符串的方法小結(jié)
這篇文章主要介紹了Go語(yǔ)言循環(huán)遍歷含有中文的字符串的幾種方法,文章通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-07-07
使用Go語(yǔ)言中的Context取消協(xié)程執(zhí)行的操作代碼
在 Go 語(yǔ)言中,協(xié)程(goroutine)是一種輕量級(jí)的線程,非常適合處理并發(fā)任務(wù),然而,如何優(yōu)雅地取消正在運(yùn)行的協(xié)程是一個(gè)常見(jiàn)的問(wèn)題,本文將通過(guò)一個(gè)具體的例子來(lái)展示如何使用 context 包來(lái)取消協(xié)程的執(zhí)行,需要的朋友可以參考下2024-11-11
探索Golang實(shí)現(xiàn)Redis持久化AOF實(shí)例
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)Redis持久化AOF實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Mango?Cache緩存管理庫(kù)TinyLFU源碼解析
這篇文章主要為大家介紹了Mango?Cache緩存管理庫(kù)TinyLFU源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
golang語(yǔ)言中wasm 環(huán)境搭建的過(guò)程詳解
將 golang 打包為 WASM,通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo ,接下來(lái)通過(guò)本文給大家介紹golang語(yǔ)言中wasm 環(huán)境搭建的過(guò)程,感興趣的朋友一起看看吧2021-11-11

