這些關于Go中interface{}的注意事項你都了解嗎
我們一起來回顧一下上一次說到的 interface{}
- 可以用來做多態(tài)
- 接口類型分為空接口類型和非空接口類型,他們的底層數(shù)據(jù)結(jié)構(gòu)不太一樣
這里順便說一下,用來作態(tài)需要滿足這樣的條件:
- 首先得有父類指針指向子類的對象
- 這個接口還必須是非空接口,里面得包含方法,也就是使用的底層數(shù)據(jù)結(jié)構(gòu)是 iface
- 子類會去實現(xiàn)父類的具體方法
interface{} 注意斷言
正常的使用斷言,寫一個簡單的 斷言 demo
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
v, ok := a.(string)
if !ok{
fmt.Println("type error")
}
fmt.Println("v == ",v)
}斷言注意寫成 2 個返回值的,一個是具體的值,一個是 bool,判斷斷言是否成功,若成功則說明斷言正確,且 v 會被賦值為實際變量的值
切忌沒頭腦的強轉(zhuǎn)
func main() {
var a Animal = "xiaomotong"
v := a.(int)
fmt.Println("v == ",v)
}上述這種寫法,若不判斷是否斷言成功,直接強轉(zhuǎn),程序是會 panic 的 ,執(zhí)行上述程序后效果如下:
>go run main.go
panic: interface conversion: main.Animal is string, not int
goroutine 1 [running]:
main.main()
D:/mycode/my_new_first/interface_test/main.go:13 +0x4c
exit status 2
程序崩掉,那就是線上問題了 xdm ,這里需要注意
當然我們也可以這樣寫
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
switch a.(type) {
case string:
fmt.Println("a type is string")
case int:
fmt.Println("a type is int")
}
}通過 switch 的方式來判斷 接口的數(shù)據(jù)類型,根據(jù)不同的數(shù)據(jù)類型來做不同的事情,進行分類處理
用于反射的注意點
golang 里面有反射這個概念,簡單來說,咱們可以通過反射包來實現(xiàn)獲取接口真實的類型,和真實的數(shù)據(jù)
舉個小例子:
通過反射來獲取 Animal 接口的數(shù)據(jù)類型,和具體的數(shù)據(jù)值
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
v := reflect.ValueOf(a)
fmt.Printf("v type == ", v.Type(), " v == ", v.String())
}執(zhí)行上述代碼后效果如下:
> go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
沒毛病正常獲取,但是如果我們這樣寫的話是不是也可以正確執(zhí)行呢?
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
v := reflect.ValueOf(a)
fmt.Printf("v type == ", v.Type(), " v == ", v.Int())
}看這個例子也就和上面的例子相差在輸出的時候,一個是v.String() ,一個是v.Int() ,可是結(jié)果卻相差很大
go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
D:\mycode\my_new_first\interface_test>go run main.go
panic: reflect: call of reflect.Value.Int on string Value
goroutine 1 [running]:
reflect.Value.Int(...)
C:/Program Files/Go/src/reflect/value.go:999
main.main()
D:/mycode/my_new_first/interface_test/main.go:26 +0x2bd
exit status 2
執(zhí)行上述代碼,go 程序給我們報了 panic 錯誤,這里需要注意 ,程序崩潰的原因是,我們將一個 string 類型的值反射成一個 Int 類型的值,直接在 反射包里面就給我們報了 panic
到此這篇關于這些關于Go中interface{}的注意事項你都了解嗎的文章就介紹到這了,更多相關Go interface{}內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang的httpserver優(yōu)雅重啟方法詳解
這篇文章主要給大家介紹了關于golang的httpserver優(yōu)雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03
golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法
這篇文章主要介紹了golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實例分析了Go語言編碼轉(zhuǎn)換的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07

