欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

這些關于Go中interface{}的注意事項你都了解嗎

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

我們一起來回顧一下上一次說到的 interface{}

  • 可以用來做多態(tài)
  • 接口類型分為空接口類型和非空接口類型,他們的底層數據結構不太一樣

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

  • 首先得有父類指針指向子類的對象
  • 這個接口還必須是非空接口,里面得包含方法,也就是使用的底層數據結構是 iface
  • 子類會去實現父類的具體方法

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 的 ,執(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 的方式來判斷 接口的數據類型,根據不同的數據類型來做不同的事情,進行分類處理

用于反射的注意點

golang 里面有反射這個概念,簡單來說,咱們可以通過反射包來實現獲取接口真實的類型,和真實的數據

舉個小例子:

通過反射來獲取 Animal 接口的數據類型,和具體的數據值

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() ,可是結果卻相差很大

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{}內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang時間處理庫go-carbon?v2.2.13發(fā)布細則

    Golang時間處理庫go-carbon?v2.2.13發(fā)布細則

    這篇文章主要為大家介紹了Golang?時間處理庫go-carbon?v2.2.13發(fā)布細則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • go語言int64整型轉字符串的實現

    go語言int64整型轉字符串的實現

    本文主要介紹了go語言int64整型轉字符串的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go語言七篇入門教程三函數方法及接口

    Go語言七篇入門教程三函數方法及接口

    這篇文章主要為大家介紹了Go語言的函數方法及接口的示例詳解,本文是Go語言七篇入門系列文章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • 深入Go goroutine理解

    深入Go goroutine理解

    這篇文章主要介紹了深入Go goroutine理解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Golang配置解析神器go?viper使用詳解

    Golang配置解析神器go?viper使用詳解

    viper是一個很完善的Go項目配置解決方案,很多著名的開源項目都在使用,比如Hugo,Docker都使用了該庫,使用viper可以讓我們專注于自己的項目代碼,而不用自己寫那些配置解析代碼,本文給大家介紹Golang配置解析神器go?viper使用,感興趣的朋友一起看看吧
    2022-05-05
  • golang搭建靜態(tài)web服務器的實現方法

    golang搭建靜態(tài)web服務器的實現方法

    這篇文章主要介紹了golang搭建靜態(tài)web服務器的實現方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 用go語言實現WebAssembly數據加密的示例講解

    用go語言實現WebAssembly數據加密的示例講解

    在Web開發(fā)中,有時候為了提升安全性需要對數據進行加密,由于js代碼相對比較易讀,直接在js中做加密安全性較低,而WebAssembly代碼不如js易讀,本文提供一個用go語言實現的WebAssembly數據加密示例,需要的朋友可以參考下
    2024-03-03
  • 淺析Go語言如何在select語句中實現優(yōu)先級

    淺析Go語言如何在select語句中實現優(yōu)先級

    這篇文章主要為大家詳細介紹了Go語言如何在select語句中實現優(yōu)先級,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • Go?Java算法之單詞搜索示例詳解

    Go?Java算法之單詞搜索示例詳解

    這篇文章主要為大家介紹了Go?Java算法之單詞搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言實現多協(xié)程文件下載器的過程詳解

    Go語言實現多協(xié)程文件下載器的過程詳解

    這篇文章主要介紹了Go語言實現多協(xié)程文件下載器的相關資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-08-08

最新評論