Golang 類型斷言的具體使用
一,如何檢測(cè)和轉(zhuǎn)換接口變量的類型
在Go語言的interface中可以是任何類型,所以Go給出了類型斷言來判斷某一時(shí)刻接口中所含有的類型,例如現(xiàn)在給出一個(gè)接口,名為InterfaceText:
x,err:=interfaceText.(T)//T是某一種類型
上式是接口斷言的一般形式,因?yàn)榇朔椒ú灰欢看味伎梢酝旰眠\(yùn)行,所以err的作用就是判斷是否出錯(cuò)。所以一般接口斷言常用以下寫法:
if v,err:=InterfaceText.(T);err {//T是一種類型
possess(v)//處理v
return
}
如果轉(zhuǎn)換合法,則v為InterfaceText轉(zhuǎn)換為類型T的值,err為ture,反之err為false。
值得注意的是:InterfaceText必須是接口類型?。?!
有些時(shí)候若是想僅判斷是否含有類型T,可以寫為:
if _,err:=InterfaceText.(T);err{
//..
return
}
下面給出一個(gè)具體的例子幫助理解:
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
}運(yùn)行結(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三種類型,就會(huì)執(zhí)行對(duì)應(yīng)的代碼,若都沒有,便會(huì)執(zhí)行default里的代碼。
如果僅判斷,而不使用值的話可以寫為:
switch InterfaceText.(type) {
case *Square:
fmt.Printf("text:%v",i)
case *Circle:
//..
case nil:
//..
default:
//..
//..and so forth
}
有時(shí)為了方便,我們可以把它打包成一個(gè)函數(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) 。
當(dāng)然也可以加入其他類型,這個(gè)看具體情況而定。
到此這篇關(guān)于Golang 類型斷言的具體使用的文章就介紹到這了,更多相關(guān)Golang 類型斷言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map
在項(xiàng)目實(shí)踐中,有時(shí)候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來介紹下常用的兩種轉(zhuǎn)換方式,希望對(duì)大家有所幫助2023-01-01
Golang對(duì)MongoDB數(shù)據(jù)庫的操作簡(jiǎn)單封裝教程
mongodb官方?jīng)]有關(guān)于go的mongodb的驅(qū)動(dòng),因此只能使用第三方驅(qū)動(dòng),mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關(guān)于利用Golang對(duì)MongoDB數(shù)據(jù)庫的操作簡(jiǎn)單封裝的相關(guān)資料,需要的朋友可以參考下2018-07-07
Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法
在 Golang 領(lǐng)域,并發(fā)發(fā)送 HTTP 請(qǐng)求是優(yōu)化 Web 應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,從基本的 goroutine 到涉及通道和sync.WaitGroup 的高級(jí)技術(shù),需要的朋友可以參考下2024-02-02
一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)
本文就來詳細(xì)說說為什么說?接口本質(zhì)是一種自定義類型,以及這種自定義類型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01
Go語言實(shí)現(xiàn)IP段范圍校驗(yàn)示例
這篇文章主要介紹了Go語言實(shí)現(xiàn)IP段范圍校驗(yàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Golang Map value不可尋址使用指針類型代替示例詳解
這篇文章主要為大家介紹了Golang Map value不可尋址使用指針類型代替示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

