首頁 > 軟體

Golang 型別斷言的具體使用

2023-03-09 06:04:43

一,如何檢測和轉換介面變數的型別

在Go語言的interface中可以是任何型別,所以Go給出了型別斷言來判斷某一時刻介面中所含有的型別,例如現在給出一個介面,名為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 : %vn",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 : %vn",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三種型別,就會執行對應的程式碼,若都沒有,便會執行default裡的程式碼。

如果僅判斷,而不使用值的話可以寫為:

switch InterfaceText.(type) {
    case *Square:
        fmt.Printf("text:%v",i)
    case *Circle:
        //..
    case nil:
        //..
    default:
        //..
    //..and so forth
}

有時為了方便,我們可以把它打包成一個函數來判斷一些未知型別:

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 型別斷言內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com