Golang 類型斷言的具體使用
一,如何檢測和轉(zhuǎn)換接口變量的類型
在Go語言的interface中可以是任何類型,所以Go給出了類型斷言來判斷某一時刻接口中所含有的類型,例如現(xiàn)在給出一個接口,名為InterfaceText:
x,err:=interfaceText.(T)//T是某一種類型
上式是接口斷言的一般形式,因為此方法不一定每次都可以完好運行,所以err的作用就是判斷是否出錯。所以一般接口斷言常用以下寫法:
if v,err:=InterfaceText.(T);err {//T是一種類型 possess(v)//處理v return }
如果轉(zhuǎn)換合法,則v為InterfaceText轉(zhuǎn)換為類型T的值,err為ture,反之err為false。
值得注意的是:InterfaceText必須是接口類型!?。?/p>
有些時候若是想僅判斷是否含有類型T,可以寫為:
if _,err:=InterfaceText.(T);err{ //.. return }
下面給出一個具體的例子幫助理解:
package main import ( "fmt" "math" ) type Square struct{ slide float32 } type Circle struct{ radius float32 } type Figure interface{ Area() float32 } func main(){ var fi Figure sq:=new(Square) sq.slide=5 fi=sq if v,err:=fi.(*Square);err { fmt.Printf("fi contain a variable of type : %v\n",v) }else { fmt.Println("fi does not contain a variable of Square") } if v2,ok:=fi.(*Circle);ok { fmt.Printf("fi contain a variable of type : %v\n",v2) }else { fmt.Println("fi does not contain a variable of Circle") } } func (s *Square) Area() float32{ return s.slide*s.slide } func (c *Circle) Area() float32{ return c.radius*c.radius*math.Pi }
運行結(jié)果:
二,類型判斷:type-switch
這是另一種類型判斷的方法,此方法和switch很相似。直接看代碼:
switch x:=InterfaceText.(type) { case *Square: fmt.Printf("text:%v",i) case *Circle: //.. case nil: //.. default: //.. //..and so forth }
理解思路和switch很相似,如果InterfaceText中有*Square,*Circle,nil三種類型,就會執(zhí)行對應(yīng)的代碼,若都沒有,便會執(zhí)行default里的代碼。
如果僅判斷,而不使用值的話可以寫為:
switch InterfaceText.(type) { case *Square: fmt.Printf("text:%v",i) case *Circle: //.. case nil: //.. default: //.. //..and so forth }
有時為了方便,我們可以把它打包成一個函數(shù)來判斷一些未知類型:
func classify(items...interface{}){ for i,x:=range items { switch x.(type) { case bool: fmt.Printf("text:%v",i) case int: //.. case float32: //.. default: //.. //..and so forth } } }
可以這樣調(diào)用此方法:classifier(13, -14.3, false) 。
當然也可以加入其他類型,這個看具體情況而定。
到此這篇關(guān)于Golang 類型斷言的具體使用的文章就介紹到這了,更多相關(guān)Golang 類型斷言內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map
在項目實踐中,有時候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來介紹下常用的兩種轉(zhuǎn)換方式,希望對大家有所幫助2023-01-01Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝教程
mongodb官方?jīng)]有關(guān)于go的mongodb的驅(qū)動,因此只能使用第三方驅(qū)動,mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關(guān)于利用Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝的相關(guān)資料,需要的朋友可以參考下2018-07-07一文帶你了解Golang中interface的設(shè)計與實現(xiàn)
本文就來詳細說說為什么說?接口本質(zhì)是一種自定義類型,以及這種自定義類型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學習一下2023-01-01Golang Map value不可尋址使用指針類型代替示例詳解
這篇文章主要為大家介紹了Golang Map value不可尋址使用指針類型代替示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11