久久精品五月,日韩不卡视频在线观看,国产精品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综合
四季av一区二区凹凸精品| 涩涩涩久久久成人精品| 国产亚洲电影| 99成人在线| 亚洲欧美综合| 欧美肉体xxxx裸体137大胆| 亚洲综合电影| 91欧美在线| 国产亚洲一区| 奇米色欧美一区二区三区| 亚洲精品免费观看| 亚洲1区在线观看| 午夜亚洲福利| 日本午夜精品久久久| 国产精品一级| 麻豆成人综合网| 国产精品欧美日韩一区| 欧美日韩一区二区三区不卡视频 | 欧美一级二区| 91精品国产自产观看在线| 国产私拍福利精品视频二区| 国产精品网在线观看| 久久精品一本| 日本综合字幕| 红桃视频国产一区| 亚洲aa在线| 国产精品极品| 神马午夜在线视频| 在线成人动漫av| 亚洲激情不卡| 亚洲va久久| 久久成人福利| 久久国产电影| 最新亚洲国产| 久久gogo国模啪啪裸体| 日韩理论视频| 五月天激情综合网| 日本免费新一区视频| 精品视频免费| 夜夜嗨一区二区| 国产日韩免费| 亚洲www啪成人一区二区| 美女久久网站| 国产欧美三级| 播放一区二区| 伊人www22综合色| 卡一卡二国产精品| 神马午夜久久| 亚洲精品大全| www在线观看黄色| 麻豆精品91| 国产精品久久久久久模特 | 国产精品7m凸凹视频分类| 亚洲一区二区三区中文字幕在线观看| 日韩高清在线一区| 一区二区三区四区日本视频| 在线综合视频| 免费一级欧美在线观看视频| 极品裸体白嫩激情啪啪国产精品| 日韩一区网站| 神马久久午夜| 日本强好片久久久久久aaa| 日韩精品不卡一区二区| 一区二区三区四区日韩| 色婷婷亚洲mv天堂mv在影片| 国产视频亚洲| 成人污污视频| 一区二区三区四区日韩| 福利视频一区| 亚洲美女久久| 久久久久亚洲| 免费国产亚洲视频| 日韩国产欧美| 国产精品99久久免费| 黄色日韩精品| 精品国产乱码久久久| 亚洲影院天堂中文av色| 欧美日韩免费看片| 国产精品夜夜夜| 水蜜桃久久夜色精品一区的特点| 精品免费在线| 日本国产一区| 另类av一区二区| 日产精品一区| 国产美女撒尿一区二区| 亚洲一区日本| 视频福利一区| 精品99久久| 日韩毛片网站| 国产一区导航| 欧美精品资源| 麻豆国产精品| 亚洲精品少妇| 亚洲视频播放| 999国产精品| 国产成人精品免费视| 欧美日韩亚洲一区在线观看| 蜜桃视频一区二区三区| 亚洲综合欧美| 丝袜av一区| av中文字幕在线观看第一页| 国产亚洲欧美日韩精品一区二区三区 | 日本中文字幕不卡| 国产亚洲一区二区手机在线观看| 欧美日韩一区自拍| 综合色就爱涩涩涩综合婷婷| 欧美午夜不卡| 99精品视频在线| 高清不卡一区| 久久99国产精品视频| 日韩avvvv在线播放| 一区二区高清| 视频一区二区不卡| 韩日一区二区三区| 女生影院久久| 国产91欧美| 精品伊人久久久| 精品久久久网| 国产美女亚洲精品7777| 91亚洲精品视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲三级欧美| 日韩在线高清| 日韩成人综合| 日韩免费看片| 色偷偷偷在线视频播放| 五月天av在线| 久久久久午夜电影| 不卡中文一二三区| 国产精品99一区二区| 久久久一二三| 欧美.日韩.国产.一区.二区| 欧美/亚洲一区| 婷婷亚洲五月| 视频一区视频二区中文| 亚洲精品美女| 欧美一区成人| 麻豆视频一区二区| 免费亚洲一区| 成人亚洲一区二区| 色在线视频观看| 欧洲亚洲一区二区三区| 久久国产中文字幕| 国精品一区二区三区| 九色精品91| 视频在线观看91| 免费人成在线不卡| 91成人在线精品视频| 国产精品白丝一区二区三区| 久久久精品国产**网站| 色在线中文字幕| 国产综合亚洲精品一区二| 久久精品国产www456c0m| 狠狠色综合网| 午夜天堂精品久久久久| 国产精选一区| 精品国产不卡| 免费在线欧美视频| 国产日韩欧美在线播放不卡| 精品三区视频| 91精品蜜臀一区二区三区在线 | 国产在线成人| 视频一区中文字幕精品 | 特黄毛片在线观看| 欧美午夜不卡| 日韩av影院| 国内精品麻豆美女在线播放视频| 久久精品亚洲人成影院| 欧美日韩少妇| 欧美亚洲tv| 亚洲风情在线资源| 麻豆精品网站| 国产精品视频一区二区三区四蜜臂| 久久精品理论片| 尤物tv在线精品| 亚洲精品日本| 国产a亚洲精品| 国产一区导航| 免费在线观看一区| 狠狠操综合网| 久久国际精品| 日韩三区在线| 日韩av不卡一区二区| 国产精品二区不卡| 香蕉久久夜色精品国产| 国产精品传媒麻豆hd| 亚洲先锋成人| 国产午夜精品一区在线观看| 精品丝袜在线| 欧美综合精品| 久久久久午夜电影| 日本午夜精品| 99久久夜色精品国产亚洲狼 | 蜜臀久久99精品久久久画质超高清 | 欧美亚洲综合视频| 欧美va天堂在线| 久久精品资源| 日韩精品一二区| 裤袜国产欧美精品一区| 视频国产精品|