這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎
我們一起來(lái)回顧一下上一次說(shuō)到的 interface{}
- 可以用來(lái)做多態(tài)
- 接口類(lèi)型分為空接口類(lèi)型和非空接口類(lèi)型,他們的底層數(shù)據(jù)結(jié)構(gòu)不太一樣
這里順便說(shuō)一下,用來(lái)作態(tài)需要滿足這樣的條件:
- 首先得有父類(lèi)指針指向子類(lèi)的對(duì)象
- 這個(gè)接口還必須是非空接口,里面得包含方法,也就是使用的底層數(shù)據(jù)結(jié)構(gòu)是 iface
- 子類(lèi)會(huì)去實(shí)現(xiàn)父類(lèi)的具體方法
interface{} 注意斷言
正常的使用斷言,寫(xiě)一個(gè)簡(jiǎn)單的 斷言 demo
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
v, ok := a.(string)
if !ok{
fmt.Println("type error")
}
fmt.Println("v == ",v)
}斷言注意寫(xiě)成 2 個(gè)返回值的,一個(gè)是具體的值,一個(gè)是 bool,判斷斷言是否成功,若成功則說(shuō)明斷言正確,且 v 會(huì)被賦值為實(shí)際變量的值
切忌沒(méi)頭腦的強(qiáng)轉(zhuǎn)
func main() {
var a Animal = "xiaomotong"
v := a.(int)
fmt.Println("v == ",v)
}上述這種寫(xiě)法,若不判斷是否斷言成功,直接強(qiáng)轉(zhuǎn),程序是會(huì) 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
程序崩掉,那就是線上問(wèn)題了 xdm ,這里需要注意
當(dāng)然我們也可以這樣寫(xiě)
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")
}
}通過(guò) switch 的方式來(lái)判斷 接口的數(shù)據(jù)類(lèi)型,根據(jù)不同的數(shù)據(jù)類(lèi)型來(lái)做不同的事情,進(jìn)行分類(lèi)處理
用于反射的注意點(diǎn)
golang 里面有反射這個(gè)概念,簡(jiǎn)單來(lái)說(shuō),咱們可以通過(guò)反射包來(lái)實(shí)現(xiàn)獲取接口真實(shí)的類(lèi)型,和真實(shí)的數(shù)據(jù)
舉個(gè)小例子:
通過(guò)反射來(lái)獲取 Animal 接口的數(shù)據(jù)類(lèi)型,和具體的數(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)
沒(méi)毛病正常獲取,但是如果我們這樣寫(xiě)的話是不是也可以正確執(zhí)行呢?
type Animal interface{}
func main() {
var a Animal = "xiaomotong"
v := reflect.ValueOf(a)
fmt.Printf("v type == ", v.Type(), " v == ", v.Int())
}看這個(gè)例子也就和上面的例子相差在輸出的時(shí)候,一個(gè)是v.String() ,一個(gè)是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 程序給我們報(bào)了 panic 錯(cuò)誤,這里需要注意 ,程序崩潰的原因是,我們將一個(gè) string 類(lèi)型的值反射成一個(gè) Int 類(lèi)型的值,直接在 反射包里面就給我們報(bào)了 panic
到此這篇關(guān)于這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎的文章就介紹到這了,更多相關(guān)Go interface{}內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang的httpserver優(yōu)雅重啟方法詳解
這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法
這篇文章主要介紹了golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實(shí)例分析了Go語(yǔ)言編碼轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Gin框架中的GET和POST表單處理的實(shí)現(xiàn)
Gin框架提供了簡(jiǎn)單而強(qiáng)大的機(jī)制來(lái)處理GET和POST表單提交的數(shù)據(jù),通過(guò)c.Query、c.PostForm、c.Bind和c.Request.FormFile等方法,可以輕松地獲取和處理各種表單數(shù)據(jù),感興趣的可以了解一下2025-03-03
Go語(yǔ)言狀態(tài)機(jī)的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言狀態(tài)機(jī)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
golang 網(wǎng)絡(luò)框架之gin的使用方法
這篇文章主要介紹了golang 網(wǎng)絡(luò)框架之gin的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

