您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)golang中有哪些斷言類型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1)語法一
t := i.(T)
解釋說明:
T:表示的是具體的數(shù)據(jù)類型,i:表示的是接口變量i,t:表示的是轉(zhuǎn)換之后的變量。
功能介紹:
這個語句實現(xiàn)的功能是:將接口變量i按照類型T轉(zhuǎn)換成t,其中t中的值是i轉(zhuǎn)換得來的,一旦轉(zhuǎn)換不成功就會觸發(fā)一個panic。
2)除此之外還有另外一個寫法:
t, ok := i.(T)
功能介紹:
表達(dá)式里面多了一個ok,實現(xiàn)的功能是:將接口i按照類型T轉(zhuǎn)換成t,如果類型匹配ok=true,如果類型不匹配,ok=false。改語句不會觸發(fā)panic。
3)例子如下所示:
package main
import "fmt"
func main() {
var i interface{} = "hello world"
str := i.(string) // 1.接口i是string類型,會將"hello world"賦值給str
fmt.Println(str)
s, ok := i.(string) // 2.接口類型是string,會將"hello world"賦值給s,并且ok=true
fmt.Println(s, ok)
idx, ok := i.(int) // 3.接口類型不是int,ok=false,idx不會從i獲取到數(shù)值
fmt.Println(idx, ok)
idx = i.(int) // 4.接口i不是int類型,會觸發(fā)panic
fmt.Println(idx)
}
Output:
hello world
hello world true
0 false
panic: interface conversion: interface {} is string, not int
goroutine 1 [running]:
main.main()
/tmp/sandbox277669744/prog.go:17 +0x1f4
3.斷言類型的使用場景:
1)T的類型是具體類型
類型斷言檢查x的動態(tài)類型是否等于具體類型T。如果檢查成功,類型斷言返回的結(jié)果是x的動態(tài)值,其類型是T。
例子可以參考2中的例子,并無特別的不同之處。
2)T的類型是接口類型
類型斷言檢查x的動態(tài)類型是否滿足T。如果檢查成功,x的動態(tài)值不會被提取,返回值是一個類型為T的接口值。換句話說,到接口類型的類型斷言,改變了表達(dá)式的類型,改變了(通常是擴(kuò)大了)可以訪問的方法,且保護(hù)了接口值內(nèi)部的動態(tài)類型和值。
例子:
package main
import (
"fmt"
)
type I interface {
walk()
}
type J interface {
fly()
}
type A struct{}
func (a A) walk() {
fmt.Println("walk!")
}
func (a A) fly() {
fmt.Println("fly!")
}
func main() {
var i I
i = A{} // dynamic type of i is A
fmt.Printf("%T\n", i.(A))
// i.fly() // 報錯:./prog.go:26:6: i.fly undefined (type I has no field or method fly)
var j J
j = i.(J) // 這里將i中的值轉(zhuǎn)換成接口J這一個類型
fmt.Printf("%T\n", j)
j.fly()
}
Output:
main.Amain.Afly!
看完上述內(nèi)容,你們對golang中有哪些斷言類型有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。