1.背景介紹:
筆者最近在使用乙個資料結構實現多個介面,但是卻發現想要在一段時間內轉換成介面1,另外一段時間轉換成介面2,所以也就使用到了斷言型別。在看過斷言型別之後,覺得還是很有必要講一講這個斷言型別,於是便有了這篇文章。
2. 斷言型別介紹:
介面型別提供一種,將介面型別轉換成具體型別的轉換方法,也就是斷言型別(assert type)。使用方法如下所示:
1)語法一
t := i.(t)
解釋說明:
t:表示的是具體的資料型別,i:表示的是介面變數i,t:表示的是轉換之後的變數。
功能介紹:
這個語句實現的功能是:將介面變數i按照型別t轉換成t,其中t中的值是i轉換得來的,一旦轉換不成功就會觸發乙個panic。
2)除此之外還有另外乙個寫法:
t, ok := i.(t)
功能介紹:
表示式裡面多了乙個ok,實現的功能是:將介面i按照型別t轉換成t,如果型別匹配ok=true,如果型別不匹配,ok=false。改語句不會觸發panic。
3)例子如下所示:
package main
import "fmt"
func main() = "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獲取到數值
fmt.println(idx, ok)
idx = i.(int) // 4.介面i不是int型別,會觸發panic
fmt.println(idx)
}
output:
hello world
hello world true
0 false
panic: inte***ce conversion: inte***ce {} is string, not int
goroutine 1 [running]:
main.main()
/tmp/sandbox277669744/prog.go:17 +0x1f4
3.斷言型別的使用場景:
1)t的型別是具體型別
型別斷言檢查x的動態型別是否等於具體型別t。如果檢查成功,型別斷言返回的結果是x的動態值,其型別是t。
例子可以參考2中的例子,並無特別的不同之處。
2)t的型別是介面型別
型別斷言檢查x的動態型別是否滿足t。如果檢查成功,x的動態值不會被提取,返回值是乙個型別為t的介面值。換句話說,到介面型別的型別斷言,改變了表示式的型別,改變了(通常是擴大了)可以訪問的方法,且保護了介面值內部的動態型別和值。
例子:
package main
import (
"fmt"
)type i inte***ce
type j inte***ce
type a struct{}
func (a a) walk()
func (a a) fly()
func main() // 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中的值轉換成介面j這乙個型別
fmt.printf("%t\n", j)
j.fly()
}
output:
main.a
main.a
fly!
**分析:
從上面的執行輸出,我們可以看出來,介面i不能夠呼叫fly()函式,儘管是用a{}來進行的賦值操作。介面j可以通過i來進行轉換,此時j.fly()就可以被使用了。
Go型別斷言
package main import fmt 型別斷言 type assertion 是乙個使用在介面值上的操作,用於檢查介面型別變數所持有的值是否實現了期望的介面或者具體的型別。如何進行型別斷言的判斷?1.使用if語句或者switch語句 2.依靠 value,ok x.t x 表示乙個介面的型...
Go之型別斷言
一 由於介面是基本型別,不知道具體型別,如果要轉成具體型別需要使用型別斷言 package main import fmt type dy struct func main var dy dy dy i1 dy var i2 dy dy i1 會報錯 型別斷言才能把介面轉為具體型別 i2 i1.dy...
go 型別斷言 (57)介面的型別斷言
go提供了乙個方法,用來判斷介面的底層值是什麼型別 型別斷言提供了訪問介面值底層具體值的方式。t i.t 該語句斷言介面值i儲存了具體型別t,並將其底層型別為t的值賦予變數t。若i並未儲存t型別的值,該語句就會觸發乙個panic。為了判斷乙個介面值是否儲存了乙個特定的型別,型別斷言可返回兩個值 其底...