久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
精精国产xxxx视频在线野外| 蜜桃视频在线观看一区| 国产精品亚洲欧美日韩一区在线| 免费日韩视频| 日韩欧美三区| 久久精品国产福利| 999国产精品永久免费视频app| 国产高清一区| 日韩成人午夜精品| 麻豆91在线播放| 丝袜美腿诱惑一区二区三区 | 成人亚洲欧美| 欧洲激情综合| 免费成人在线观看| 欧美日韩在线精品一区二区三区激情综合| 久久久久伊人| 午夜国产欧美理论在线播放 | 激情丁香综合| 亚洲ww精品| 成人欧美一区二区三区的电影| 亚洲经典在线| 欧美交a欧美精品喷水| 久久久成人网| 亚洲bt欧美bt精品777| 精品国产亚洲一区二区在线观看| 九九久久国产| 蜜桃久久av| 国产精品高颜值在线观看| 免费久久99精品国产自在现线| 欧美一区精品| 欧美日韩国产高清电影| 国产精品久av福利在线观看| 亚洲福利一区| 国产精品免费大片| 国产亚洲网站| 91综合视频| 欧美一区=区三区| 精品一区在线| 成人国产综合| 亚洲18在线| 播放一区二区| 国产精品亚洲成在人线| 亚洲一区二区毛片| 国产精品不卡| 日韩二区在线观看| 久久aⅴ国产紧身牛仔裤| 国产精品成人一区二区不卡| 午夜性色一区二区三区免费视频| 亚洲涩涩在线| 久久久久久亚洲精品美女| 石原莉奈一区二区三区在线观看| 国产拍在线视频| 国产精品一区二区三区美女| 免播放器亚洲| 黄色不卡一区| av在线资源| 国产精品欧美大片| 亚洲视频二区| 在线视频亚洲| 亚洲电影在线| 另类中文字幕国产精品| 蜜桃久久久久| 欧美在线91| 亚洲精品成a人ⅴ香蕉片| 亚洲电影在线一区二区三区| 日韩在线二区| 成人影视亚洲图片在线| 日韩和欧美的一区| 亚洲视频二区| 蜜臀久久99精品久久久久久9 | 久久只有精品| 欧美日韩xxxx| 91亚洲精品视频在线观看| 免费日韩av| 一区二区自拍| 亚洲精品午夜av福利久久蜜桃| 欧美天堂视频| 欧美香蕉视频| 成人免费电影网址| 日韩欧美精品一区| 成人看片网站| 极品日韩av| 伊人久久亚洲影院| 亚洲综合不卡| 一区二区自拍| 午夜亚洲福利在线老司机| 日韩视频不卡| 久久国产精品亚洲77777| 红桃视频国产精品| 热久久免费视频| 日本中文字幕一区二区| 亚洲精品第一| 国产日产精品_国产精品毛片| 欧美在线不卡| 久久精品国产99| 国产成年精品| 99精品小视频| 亚洲少妇诱惑| 日韩一区二区三区高清在线观看| 亚洲一区二区三区中文字幕在线观看| 美女精品一区| 欧美性www| 成人精品动漫一区二区三区| 亚洲日本网址| 在线亚洲欧美| 日韩不卡一区二区| 久久影院一区二区三区| 欧美精品日日操| 国产一区91| 日本中文字幕不卡| 国产精品99精品一区二区三区∴| 红杏一区二区三区| 久久要要av| 中文字幕日本一区二区| 日本特黄久久久高潮| 国产精品视频一区二区三区综合| 国语精品一区| 亚洲高清久久| 日韩区欧美区| 人在线成免费视频| 老鸭窝毛片一区二区三区| 国产日韩免费| 久久激情网站| 日本国产欧美| 日韩欧美少妇| 亚洲综合婷婷| 国产成人在线中文字幕| 欧美日韩国产免费观看视频| 婷婷精品在线| 精品国产a一区二区三区v免费| 久久国产主播| 欧美日韩视频免费看| 欧洲亚洲一区二区三区| 亚洲精品极品| 高清不卡亚洲| 亚洲精品护士| 日韩深夜视频| 日韩高清中文字幕一区| 色爱综合网欧美| 亚洲无线观看| 黑人精品一区| 日本少妇精品亚洲第一区| 久久久一二三| 久久国内精品自在自线400部| 精精国产xxxx视频在线播放 | 日韩在线一二三区| 精品一区二区三区免费看| 欧美日韩国产一区精品一区| 国产精品v一区二区三区| 欧美1区2区3区| 欧美黑人巨大videos精品| 奶水喷射视频一区| 天堂√中文最新版在线| 久久精品超碰| 午夜在线视频观看日韩17c| 成人亚洲一区二区| 欧美日韩亚洲一区三区| 国产亚洲网站| 韩国久久久久久| 91精品尤物| 国产视频一区欧美| 日韩专区精品| 久久精品免费看| 日韩国产在线一| 中文在线不卡| 亚洲v在线看| 国产aⅴ精品一区二区四区| 日本午夜精品久久久| 国产视频欧美| 日韩高清成人| 国产一区二区三区网| 日韩av一二三| 模特精品在线| 亚洲午夜在线| 久久久久99| 欧产日产国产精品视频| 国际精品欧美精品| 国产极品嫩模在线观看91精品| 日本在线成人| 亚洲色图综合| 另类激情亚洲| 久久一二三区| 亚洲一区日韩| 99国产成+人+综合+亚洲欧美| 三级小说欧洲区亚洲区| 国产精品二区不卡| 精品少妇一区| 精品三级国产| 国产精品巨作av| 欧美中文高清| 国产欧美日韩影院| 久久国产尿小便嘘嘘| 91麻豆精品激情在线观看最新| 亚洲精品中文字幕99999| 亚洲不卡视频| 欧美日韩一区自拍| 国产精品115| 国产一区二区三区亚洲综合| 麻豆国产精品| 成人片免费看|