酒店和網(wǎng)站對接如何做app推廣平臺(tái)網(wǎng)站
類型斷言
作用
- 檢查 i 是否為 nil
- 檢查 i 存儲(chǔ)的值是否為某個(gè)類型
使用方式
第一種:
t := i.(T)
這個(gè)表達(dá)式可以斷言一個(gè)接口對象(i)里不是 nil,并且接口對象(i)存儲(chǔ)的值的類型是 T
,如果斷言成功,就會(huì)返回值給 t,如果斷言失敗,就會(huì)觸發(fā) panic。(即nil或者接口對象類型不為T時(shí)均會(huì)觸發(fā)panic)
eg;
func main() {var i interface{} = 10t1 := i.(int)fmt.Println(t1)fmt.Println("=====分隔線=====")t2 := i.(string)fmt.Println(t2)
}
可以發(fā)現(xiàn)在執(zhí)行第二次斷言的時(shí)候失敗了,并且觸發(fā)了 panic。
第二種
t, ok:= i.(T)
??和上面一樣,這個(gè)表達(dá)式也是可以斷言一個(gè)接口對象(i)里不是 nil,并且接口對象(i)存儲(chǔ)的值的類型是 T,如果斷言成功,就會(huì)返回其值給 t,并且此時(shí) ok 的值 為 true,表示斷言成功。
??如果接口值的類型,并不是我們所斷言的 T,就會(huì)斷言失敗,但和第一種表達(dá)式不同的事,這個(gè)不會(huì)觸發(fā) panic,而是將 ok 的值設(shè)為 false ,表示斷言失敗,此時(shí)t 為 T 的零值。
eg:
func main() {var i interface{} = 10t1, ok := i.(int)fmt.Printf("%d-%t\n", t1, ok)fmt.Println("=====分隔線1=====")t2, ok := i.(string)fmt.Printf("%s-%t\n", t2, ok)fmt.Println("=====分隔線2=====")var k interface{} // nilt3, ok := k.(interface{})fmt.Println(t3, "-", ok)fmt.Println("=====分隔線3=====")k = 10t4, ok := k.(interface{})fmt.Printf("%d-%t\n", t4, ok)t5, ok := k.(int)fmt.Printf("%d-%t\n", t5, ok)
}
類型斷言(Type Switch)
如果需要區(qū)分多種類型,可以使用 type switch 斷言,這個(gè)將會(huì)比一個(gè)一個(gè)進(jìn)行類型斷言更簡單、直接、高效。
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) // intfindType("hello") // stringvar k interface{} // nilfindType(k)findType(10.23) //float64
}
注:
-
類型斷言,
僅能對靜態(tài)類型為空接口(interface{})的對象進(jìn)行斷言
,否則會(huì)拋出錯(cuò)誤。 -
類型斷言完成后,實(shí)際上會(huì)返回靜態(tài)類型為你斷言的類型的對象,而要清楚原來的靜態(tài)類型為空接口類型(interface{}),這是 Goang的隱式轉(zhuǎn)換。