站長資訊網
        最全最豐富的資訊網站

        go語言類型斷言是啥

        在go語言中,類型斷言是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實現了期望的接口或者具體的類型,語法為“value, ok := x.(T)”。通過類型斷言可以做到的事情:1、檢查i是否為nil;2、檢查i存儲的值是否為某個類型。

        go語言類型斷言是啥

        本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

        斷言是什么?

        斷言是編程術語,表示為一些布爾表達。編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設。簡單的來理解斷言的話就是判斷的意思。所以在Go中類型斷言我們就可以理解成對類型的判斷。

        類型斷言介紹

        類型斷言(Type Assertion)是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實現了期望的接口或者具體的類型。

        在Go語言中類型斷言的語法格式如下:

        value, ok := x.(T)
        登錄后復制

        其中,x 表示一個接口的類型,T 表示一個具體的類型(也可為接口類型)。

        該斷言表達式會返回 x 的值(也就是 value)和一個布爾值(也就是 ok),可根據該布爾值判斷 x 是否為 T 類型:

        • 如果 T 是具體某個類型,類型斷言會檢查 x 的動態類型是否等于具體類型 T。如果檢查成功,類型斷言返回的結果是 x 的動態值,其類型是 T。

        • 如果 T 是接口類型,類型斷言會檢查 x 的動態類型是否滿足 T。如果檢查成功,x 的動態值不會被提取,返回值是一個類型為 T 的接口值。

        • 無論 T 是什么類型,如果 x 是 nil 接口值,類型斷言都會失敗。

        在Go中類型斷言主要有兩種形式

        • 變量.(類型)。例如:i.(int)

        • 變量,bool = 變量.(類型)。例如:num,ok = i.(int)。ok表示判斷類型是否成功的意思。

        類型斷言的用法

        通過類型斷言可以做到以下幾件事情

        • 檢查 i 是否為 nil

        • 檢查 i 存儲的值是否為某個類型

        具體的使用方式有兩種:

        第一種:

        t := i.(T)
        登錄后復制

        這個表達式可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回值給 t,如果斷言失敗,就會觸發 panic。

        來寫段代碼試驗一下

        package main  import "fmt"  func main() {     var i interface{} = 10     t1 := i.(int)     fmt.Println(t1)      fmt.Println("=====分隔線=====")      t2 := i.(string)     fmt.Println(t2) }
        登錄后復制

        運行后輸出如下,可以發現在執行第二次斷言的時候失敗了,并且觸發了 panic

        10 =====分隔線===== panic: interface conversion: interface {} is int, not string  goroutine 1 [running]: main.main()         E:/GoPlayer/src/main.go:12 +0x10e exit status 2
        登錄后復制

        如果要斷言的接口值是 nil,那我們來看看也是不是也如預期一樣會觸發panic

        package main  func main() {     var i interface{} // nil     var _ = i.(interface{}) }
        登錄后復制

        輸出如下,確實是會 觸發 panic

        panic: interface conversion: interface is nil, not interface {}  goroutine 1 [running]: main.main()         E:/GoPlayer/src/main.go:5 +0x34 exit status 2
        登錄后復制

        第二種

        t, ok:= i.(T)
        登錄后復制

        和上面一樣,這個表達式也是可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回其類型給 t,并且此時 ok 的值 為 true,表示斷言成功。

        如果接口值的類型,并不是我們所斷言的 T,就會斷言失敗,但和第一種表達式不同的事,這個不會觸發 panic,而是將 ok 的值設為 false ,表示斷言失敗,此時t 為 T 的零值。

        稍微修改下上面的例子,如下

        package main  import "fmt"  func main() {     var i interface{} = 10     t1, ok := i.(int)     fmt.Printf("%d-%tn", t1, ok)      fmt.Println("=====分隔線1=====")      t2, ok := i.(string)     fmt.Printf("%s-%tn", t2, ok)      fmt.Println("=====分隔線2=====")      var k interface{} // nil     t3, ok := k.(interface{})     fmt.Println(t3, "-", ok)      fmt.Println("=====分隔線3=====")     k = 10     t4, ok := k.(interface{})     fmt.Printf("%d-%tn", t4, ok)      t5, ok := k.(int)     fmt.Printf("%d-%tn", t5, ok) }
        登錄后復制

        運行后輸出如下,可以發現在執行第二次斷言的時候,雖然失敗了,但并沒有觸發了 panic。

        10-true =====分隔線1===== -false =====分隔線2===== <nil> - false =====分隔線3===== 10-true 10-true
        登錄后復制

        上面這段輸出,你要注意的是第二個斷言的輸出在-false 之前并不是有沒有輸出任何 t2 的值,而是由于斷言失敗,所以 t2 得到的是 string 的零值也是 "" ,它是零長度的,所以你看不到其輸出。

        Type Switch

        如果需要區分多種類型,可以使用 type switch 斷言,這個將會比一個一個進行類型斷言更簡單、直接、高效。

        package main  import "fmt"  func findType(i interface{}) {     switch x := i.(type) {     case int:         fmt.Println(x, "is int")     case string:         fmt.Println(x, "is string")     case nil:         fmt.Println(x, "is nil")     default:         fmt.Println(x, "not type matched")     } }  func main() {     findType(10)      // int     findType("hello") // string      var k interface{} // nil     findType(k)      findType(10.23) //float64 }
        登錄后復制

        輸出如下

        10 is int hello is string <nil> is nil 10.23 not type matched
        登錄后復制

        額外說明一下:

        • 如果你的值是 nil,那么匹配的是 case nil
        • 如果你的值在 switch-case 里并沒有匹配對應的類型,那么走的是 default 分支

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久99精品久久久久久不卡| 久久水蜜桃亚洲av无码精品麻豆| 亚洲欧美日韩久久精品| 久久精品国产99国产精偷 | 午夜三级国产精品理论三级| 久久九九青青国产精品| 久久99精品久久久久久hb无码| 日韩精品一二三区| 久久精品国产亚洲Aⅴ香蕉| 99久久精品费精品国产| 精品久久久久久| 国产精品免费看久久久 | 亚洲精品无码av人在线观看| 久久99精品国产麻豆不卡| 国产精品欧美久久久久无广告| 国产大片91精品免费观看不卡| 精品国产乱码一区二区三区| 欧美性videos高清精品| 亚洲高清专区日韩精品| 亚洲精品WWW久久久久久| 偷拍精品视频一区二区三区| 欧美激情视频精品一区二区| 久久亚洲AV永久无码精品| 精品久久久久久无码中文字幕 | 人人妻人人澡人人爽精品日本| 亚洲精品美女久久777777| 在线精品国产一区二区三区| 亚洲日韩精品A∨片无码| 中日精品无码一本二本三本| 亚洲精品高清一二区久久| 天天视频国产精品| 亚洲精品456播放| 亚洲码国产精品高潮在线| 亚洲线精品一区二区三区| 午夜精品久久久久久毛片| 亚洲欧美日韩国产精品| 在线精品亚洲一区二区小说| 亚洲处破女AV日韩精品| 久久精品无码专区免费东京热| 国产乱码精品一品二品| 国产精品55夜色66夜色|