溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go中interface{}的注意事項是什么

發(fā)布時間:2023-03-09 11:58:15 來源:億速云 閱讀:92 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Go中interface{}的注意事項是什么”,在日常操作中,相信很多人在Go中interface{}的注意事項是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Go中interface{}的注意事項是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

interface{} 注意斷言

正常的使用斷言,寫一個簡單的 斷言 demo

type Animal interface{}

func main() {
    var a Animal = "xiaomotong"
    v, ok := a.(string)
    if !ok{
        fmt.Println("type error")
    }
    fmt.Println("v == ",v)
}

斷言注意寫成 2 個返回值的,一個是具體的值,一個是 bool,判斷斷言是否成功,若成功則說明斷言正確,且 v 會被賦值為實際變量的值

切忌沒頭腦的強轉(zhuǎn)

func main() {
    var a Animal = "xiaomotong"

    v := a.(int)
    fmt.Println("v == ",v)
}

上述這種寫法,若不判斷是否斷言成功,直接強轉(zhuǎn),程序是會 panic 的 ,執(zhí)行上述程序后效果如下:

>go run main.go
panic: interface conversion: main.Animal is string, not int

goroutine 1 [running]:
main.main()
        D:/mycode/my_new_first/interface_test/main.go:13 +0x4c
exit status 2

程序崩掉,那就是線上問題了 xdm ,這里需要注意

當(dāng)然我們也可以這樣寫

type Animal interface{}

func main() {
    var a Animal = "xiaomotong"

    switch a.(type) {

    case string:
        fmt.Println("a type is string")
    case int:
        fmt.Println("a type is int")
    }

}

通過 switch 的方式來判斷 接口的數(shù)據(jù)類型,根據(jù)不同的數(shù)據(jù)類型來做不同的事情,進行分類處理

用于反射的注意點

golang 里面有反射這個概念,簡單來說,咱們可以通過反射包來實現(xiàn)獲取接口真實的類型,和真實的數(shù)據(jù)

舉個小例子:

通過反射來獲取 Animal 接口的數(shù)據(jù)類型,和具體的數(shù)據(jù)值

type Animal interface{}

func main() {
    var a Animal = "xiaomotong"
    v := reflect.ValueOf(a)
    fmt.Printf("v type == ", v.Type(), " v == ", v.String())
}

執(zhí)行上述代碼后效果如下:

> go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)

沒毛病正常獲取,但是如果我們這樣寫的話是不是也可以正確執(zhí)行呢?

type Animal interface{}

func main() {
    var a Animal = "xiaomotong"
    v := reflect.ValueOf(a)
    fmt.Printf("v type == ", v.Type(), " v == ", v.Int())
}

看這個例子也就和上面的例子相差在輸出的時候,一個是v.String() ,一個是v.Int() ,可是結(jié)果卻相差很大

go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
D:\mycode\my_new_first\interface_test>go run main.go
panic: reflect: call of reflect.Value.Int on string Value

goroutine 1 [running]:
reflect.Value.Int(...)
        C:/Program Files/Go/src/reflect/value.go:999
main.main()
        D:/mycode/my_new_first/interface_test/main.go:26 +0x2bd
exit status 2

執(zhí)行上述代碼,go 程序給我們報了 panic 錯誤,這里需要注意 ,程序崩潰的原因是,我們將一個 string 類型的值反射成一個 Int 類型的值,直接在 反射包里面就給我們報了 panic。

到此,關(guān)于“Go中interface{}的注意事項是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI