<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們一起來回顧一下上一次說到的 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 會被賦值為實際變數的值
切忌沒頭腦的強轉
func main() { var a Animal = "xiaomotong" v := a.(int) fmt.Println("v == ",v) }
上述這種寫法,若不判斷是否斷言成功,直接強轉,程式是會 panic 的 ,執行上述程式後效果如下:
>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 的方式來判斷 介面的資料型別,根據不同的資料型別來做不同的事情,進行分類處理
golang 裡面有反射這個概念,簡單來說,咱們可以通過反射包來實現獲取介面真實的型別,和真實的資料
舉個小例子:
通過反射來獲取 Animal 介面的資料型別,和具體的資料值
type Animal interface{} func main() { var a Animal = "xiaomotong" v := reflect.ValueOf(a) fmt.Printf("v type == ", v.Type(), " v == ", v.String()) }
執行上述程式碼後效果如下:
> go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
沒毛病正常獲取,但是如果我們這樣寫的話是不是也可以正確執行呢?
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()
,可是結果卻相差很大
go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
D:mycodemy_new_firstinterface_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
執行上述程式碼,go 程式給我們報了 panic 錯誤,這裡需要注意 ,程式崩潰的原因是,我們將一個 string 型別的值反射成一個 Int 型別的值,直接在 反射包裡面就給我們報了 panic
到此這篇關於這些關於Go中interface{}的注意事項你都瞭解嗎的文章就介紹到這了,更多相關Go interface{}內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45