Golang 類型斷言的具體使用
一,如何檢測和轉換接口變量的類型
在Go語言的interface中可以是任何類型,所以Go給出了類型斷言來判斷某一時刻接口中所含有的類型,例如現(xiàn)在給出一個接口,名為InterfaceText:
x,err:=interfaceText.(T)//T是某一種類型
上式是接口斷言的一般形式,因為此方法不一定每次都可以完好運行,所以err的作用就是判斷是否出錯。所以一般接口斷言常用以下寫法:
if v,err:=InterfaceText.(T);err {//T是一種類型
possess(v)//處理v
return
}
如果轉換合法,則v為InterfaceText轉換為類型T的值,err為ture,反之err為false。
值得注意的是:InterfaceText必須是接口類型!??!
有些時候若是想僅判斷是否含有類型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
}運行結果:

二,類型判斷: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í)行對應的代碼,若都沒有,便會執(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
}
}
}可以這樣調用此方法:classifier(13, -14.3, false) 。
當然也可以加入其他類型,這個看具體情況而定。
到此這篇關于Golang 類型斷言的具體使用的文章就介紹到這了,更多相關Golang 類型斷言內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang實現(xiàn)優(yōu)雅的將struct轉換為map
在項目實踐中,有時候我們需要將struct結構體轉為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來介紹下常用的兩種轉換方式,希望對大家有所幫助2023-01-01
Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝教程
mongodb官方沒有關于go的mongodb的驅動,因此只能使用第三方驅動,mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關于利用Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝的相關資料,需要的朋友可以參考下2018-07-07
一文帶你了解Golang中interface的設計與實現(xiàn)
本文就來詳細說說為什么說?接口本質是一種自定義類型,以及這種自定義類型是如何構建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學習一下2023-01-01
Golang Map value不可尋址使用指針類型代替示例詳解
這篇文章主要為大家介紹了Golang Map value不可尋址使用指針類型代替示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

