最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎

 更新時(shí)間:2023年03月08日 14:05:43   作者:阿兵云原生  
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語(yǔ)言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下

我們一起來(lái)回顧一下上一次說(shuō)到的 interface{}

  • 可以用來(lái)做多態(tài)
  • 接口類型分為空接口類型和非空接口類型,他們的底層數(shù)據(jù)結(jié)構(gòu)不太一樣

這里順便說(shuō)一下,用來(lái)作態(tài)需要滿足這樣的條件:

  • 首先得有父類指針指向子類的對(duì)象
  • 這個(gè)接口還必須是非空接口,里面得包含方法,也就是使用的底層數(shù)據(jù)結(jié)構(gòu)是 iface
  • 子類會(huì)去實(shí)現(xiàn)父類的具體方法

interface{} 注意斷言

正常的使用斷言,寫一個(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)
}

斷言注意寫成 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)
}

上述這種寫法,若不判斷是否斷言成功,直接強(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)然我們也可以這樣寫

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ù)類型,根據(jù)不同的數(shù)據(jù)類型來(lái)做不同的事情,進(jìn)行分類處理

用于反射的注意點(diǎn)

golang 里面有反射這個(gè)概念,簡(jiǎn)單來(lái)說(shuō),咱們可以通過(guò)反射包來(lái)實(shí)現(xiàn)獲取接口真實(shí)的類型,和真實(shí)的數(shù)據(jù)

舉個(gè)小例子:

通過(guò)反射來(lái)獲取 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)

沒(méi)毛病正常獲取,但是如果我們這樣寫的話是不是也可以正確執(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 類型的值反射成一個(gè) Int 類型的值,直接在 反射包里面就給我們報(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)雅重啟方法詳解

    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 占位符

    一文了解golang 占位符

    本文主要介紹了一文了解golang 占位符,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法

    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
  • golang如何去除多余空白字符(含制表符)

    golang如何去除多余空白字符(含制表符)

    這篇文章主要介紹了golang去除多余空白字符(含制表符)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Gin框架中的GET和POST表單處理的實(shí)現(xiàn)

    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
  • Golang操作命令行的幾種方式總結(jié)

    Golang操作命令行的幾種方式總結(jié)

    這篇文章主要介紹了Golang操作命令行的幾種方式總結(jié),文章通過(guò)圍主題思想展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Go語(yǔ)言狀態(tài)機(jī)的實(shí)現(xiàn)

    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的使用方法

    這篇文章主要介紹了golang 網(wǎng)絡(luò)框架之gin的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解Golang中strconv庫(kù)的用法

    詳解Golang中strconv庫(kù)的用法

    strconv包提供了字符串和基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換功能,本文將帶大家深入了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的strconv包,掌握其常用的函數(shù)和用法,希望對(duì)大家有所幫助
    2023-06-06
  • Go語(yǔ)言的os包中常用函數(shù)初步歸納

    Go語(yǔ)言的os包中常用函數(shù)初步歸納

    這篇文章主要介紹了Go語(yǔ)言的os包中常用函數(shù)初步歸納,用于一些和系統(tǒng)交互功能的實(shí)現(xiàn),需要的朋友可以參考下
    2015-10-10

最新評(píng)論

巴中市| 阿拉尔市| 江北区| 合水县| 白河县| 嘉祥县| 普宁市| 日喀则市| 新乡市| 五华县| 梧州市| 云阳县| 道孚县| 兴安县| 汝州市| 许昌县| 星子县| 吉林市| 高尔夫| 台北市| 双桥区| 塔河县| 邢台市| 林周县| 东方市| 崇明县| 健康| 浪卡子县| 麟游县| 红原县| 新民市| 科技| 眉山市| 牡丹江市| 千阳县| 镇赉县| 论坛| 鹤壁市| 隆子县| 阜阳市| 塘沽区|