久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      go語(yǔ)言類型斷言是啥

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

      go語(yǔ)言類型斷言是啥

      本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

      斷言是什么?

      斷言是編程術(shù)語(yǔ),表示為一些布爾表達(dá)。編寫代碼時(shí),我們總是會(huì)做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè)。簡(jiǎn)單的來(lái)理解斷言的話就是判斷的意思。所以在Go中類型斷言我們就可以理解成對(duì)類型的判斷。

      類型斷言介紹

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

      在Go語(yǔ)言中類型斷言的語(yǔ)法格式如下:

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

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

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

      • 如果 T 是具體某個(gè)類型,類型斷言會(huì)檢查 x 的動(dòng)態(tài)類型是否等于具體類型 T。如果檢查成功,類型斷言返回的結(jié)果是 x 的動(dòng)態(tài)值,其類型是 T。

      • 如果 T 是接口類型,類型斷言會(huì)檢查 x 的動(dòng)態(tài)類型是否滿足 T。如果檢查成功,x 的動(dòng)態(tài)值不會(huì)被提取,返回值是一個(gè)類型為 T 的接口值。

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

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

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

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

      類型斷言的用法

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

      • 檢查 i 是否為 nil

      • 檢查 i 存儲(chǔ)的值是否為某個(gè)類型

      具體的使用方式有兩種:

      第一種:

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

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

      來(lái)寫段代碼試驗(yàn)一下

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

      運(yùn)行后輸出如下,可以發(fā)現(xiàn)在執(zhí)行第二次斷言的時(shí)候失敗了,并且觸發(fā)了 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
      登錄后復(fù)制

      如果要斷言的接口值是 nil,那我們來(lái)看看也是不是也如預(yù)期一樣會(huì)觸發(fā)panic

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

      輸出如下,確實(shí)是會(huì) 觸發(fā) panic

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

      第二種

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

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

      如果接口值的類型,并不是我們所斷言的 T,就會(huì)斷言失敗,但和第一種表達(dá)式不同的事,這個(gè)不會(huì)觸發(fā) panic,而是將 ok 的值設(shè)為 false ,表示斷言失敗,此時(shí)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) }
      登錄后復(fù)制

      運(yùn)行后輸出如下,可以發(fā)現(xiàn)在執(zhí)行第二次斷言的時(shí)候,雖然失敗了,但并沒有觸發(fā)了 panic。

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

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

      Type Switch

      如果需要區(qū)分多種類型,可以使用 type switch 斷言,這個(gè)將會(huì)比一個(gè)一個(gè)進(jìn)行類型斷言更簡(jiǎn)單、直接、高效。

      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 }
      登錄后復(fù)制

      輸出如下

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

      額外說明一下:

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)