五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

關(guān)于 interface{} 會有啥注意事項?下

2023-03-07 21:44 作者:阿兵云原生  | 我要投稿

我們一起來回顧一下上一次說到的 ?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 ,這里需要注意

當(dāng)然我們也可以這樣寫

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

小知識,大挑戰(zhàn),簡單的寫 2 個注意事項,給 xdm 提個醒

歡迎點贊,關(guān)注,收藏

朋友們,你的支持和鼓勵,是我堅持分享,提高質(zhì)量的動力

好了,本次就到這里

技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。

我是阿兵云原生,歡迎點贊關(guān)注收藏,下次見~


關(guān)于 interface{} 會有啥注意事項?下的評論 (共 條)

分享到微博請遵守國家法律
玛纳斯县| 前郭尔| 孝感市| 五大连池市| 卢氏县| 永川市| 遂川县| 紫阳县| 徐州市| 西华县| 大田县| 偃师市| 平潭县| 临澧县| 湖南省| 平和县| 巴东县| 安远县| 嘉禾县| 崇明县| 东阳市| 武宁县| 荥阳市| 辽阳县| 宁强县| 即墨市| 武平县| 蚌埠市| 汤原县| 大同市| 美姑县| 吕梁市| 营山县| 观塘区| 峡江县| 花垣县| 卢龙县| 高唐县| 宁强县| 册亨县| 天祝|