gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费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號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日日噜噜夜夜狠狠久久丁香五月 | 欧美在线aaa| 妓院一钑片免看黄大片| 欧美图片激情小说| 国产无限制自拍| 久久久久久香蕉| 午夜xxxxx| av在线播放亚洲| 免费在线观看的av网站| 男人插女人下面免费视频| 182午夜在线观看| 夜夜爽久久精品91| 精品国产成人av在线免| theporn国产精品| 亚洲 欧美 综合 另类 中字| 日本欧美视频在线观看| 三上悠亚av一区二区三区| 一区二区三区日韩视频| 国产情侣av自拍| 一本色道无码道dvd在线观看| 亚洲视频在线a| 日本手机在线视频| 91av视频免费观看| 亚洲性生活网站| 欧美极品欧美精品欧美图片| 4444在线观看| 国产精品亚洲天堂| 精品日韩久久久| 99999精品视频| 激情六月丁香婷婷| 国产原创popny丨九色| 免费人成自慰网站| 青青在线视频免费观看| www.av91| 久久精品99国产| 成年人免费在线播放| 男人亚洲天堂网| 三年中国国语在线播放免费| 超碰在线播放91| 午夜视频在线网站| 妞干网在线播放| 福利视频免费在线观看| 日韩网站在线免费观看| 人妻有码中文字幕| 思思久久精品视频| 欧美a v在线播放| 色一情一乱一伦一区二区三区日本| 狠狠热免费视频| 日韩国产小视频| 国产 porn| 亚洲色欲久久久综合网东京热| 国产美女主播在线播放| 在线看的黄色网址| 国产在线无码精品| 日韩在线一区视频| 欧美日韩黄色一级片| 国产又黄又爽免费视频| 人妻内射一区二区在线视频| 欧美一级中文字幕| www.五月天色| 中文字幕天天干| 免费大片在线观看| 亚洲 欧美 日韩 国产综合 在线| 99sesese| 美女喷白浆视频| 国产成人精品视频免费看| 黄色录像特级片| 最新视频 - x88av| 中文字幕一区二区三区四| 宅男噜噜噜66国产免费观看| av在线免费观看国产| 日韩成人午夜影院| 一级特黄妇女高潮| 成人毛片一区二区| 欧美性久久久久| mm131亚洲精品| 成人黄色一级大片| 无码人妻精品一区二区蜜桃百度| 一级黄色录像免费看| 久久久天堂国产精品| 国产精品无码人妻一区二区在线| 菠萝蜜视频在线观看入口| 99视频精品全部免费看| 福利在线小视频| 无码aⅴ精品一区二区三区浪潮| 国产超级av在线| 国产成人美女视频| 精品少妇人妻av免费久久洗澡| 北条麻妃视频在线| 久久久久亚洲av无码专区喷水| 国产免费黄色小视频| www.精品在线| 欧美日韩亚洲一| 欧美黄色免费网址| 中文字幕亚洲影院| 人妻有码中文字幕| 老司机av福利| 婷婷激情四射五月天| 毛片在线播放视频| 影音先锋男人的网站| 岛国av在线免费| 老司机午夜av| 一级黄色香蕉视频| 男人的天堂99| 日韩精品一区二区三区色欲av| 91免费视频黄| 国产日韩第一页| 国产美女视频免费看| 久久久精品麻豆| 五月婷婷丁香色| 一级黄色大片儿| 黄色免费高清视频| 青草网在线观看| 美女日批免费视频| 久久网站免费视频| 在线视频日韩一区 | www.亚洲高清| 国产麻豆电影在线观看| 欧美日韩一区二区三区电影| 中文字幕av久久| 久久久久久久久久网| 日韩欧美在线播放视频| 亚洲乱码国产一区三区| 国内国产精品天干天干| 国产又粗又爽又黄的视频| 青青在线免费视频| 黄色在线视频网| 欧美激情亚洲天堂| 国产美女在线一区| 5月婷婷6月丁香| 国产一二三在线视频| 超碰在线人人爱| 日本大胆人体视频| 成人日韩在线视频| av免费中文字幕| 国产精品久久久久久久乖乖| 国产精品av免费| 樱花草www在线| 亚洲欧洲日本精品| 邪恶网站在线观看| 欧美伦理视频在线观看| 少妇高潮喷水在线观看| 妞干网这里只有精品| 天天综合成人网| 手机在线国产视频| 手机看片日韩国产| 成人免费在线视频播放| 大片在线观看网站免费收看| 亚洲av毛片在线观看| 涩涩网站在线看| 成人区一区二区| 手机av在线网站| 国风产精品一区二区| 免费一级特黄录像| 女性女同性aⅴ免费观女性恋| 久久亚洲a v| 天堂社区在线视频| r级无码视频在线观看| 91福利免费观看| 亚洲一级免费观看| 亚洲美免无码中文字幕在线 | 日韩一级片一区二区| 强伦女教师2:伦理在线观看| 人人妻人人澡人人爽精品欧美一区| 亚洲一区二区偷拍| 国产成人无码精品久久久性色| 国产精品一线二线三线| 在线观看免费成人av| 大伊香蕉精品视频在线| 91国内在线播放| 9191国产视频| 九九热精品国产| 日韩精品免费播放| 日韩av在线播放不卡| 污网站在线免费| 香蕉视频网站入口| 男人插女人视频在线观看| 中文字幕第100页| 久久久久久久久久久视频| 男女爱爱视频网站| 手机精品视频在线| 欧美一级片中文字幕| 丁香六月激情婷婷| 国产真实老熟女无套内射| 亚洲激情在线看| 日本中文字幕精品—区二区| 天天视频天天爽| 黄色a级三级三级三级| 亚洲欧美偷拍另类| 色18美女社区| www激情五月| 999一区二区三区| 亚洲色成人www永久在线观看 | 日本福利视频在线观看| 亚洲理论电影在线观看| 苍井空浴缸大战猛男120分钟| 人妻有码中文字幕| 国产一级特黄a大片免费| 手机看片日韩国产| 日本韩国欧美在线观看|