1. 程式人生 > 其它 >golang判斷變數的型別

golang判斷變數的型別

判斷container的型別


列印其中的元素之前,正確判斷變數的型別,使用“型別斷言”表示式。
value, ok := interface{}(container).([]string)

 

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    var v interface{}

    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    for i := 0; i < 10; i++{
        v = i 
        if (r.Intn(100) % 2) == 0 { 
            v = "hello"
        }   

        if _, ok := v.(int); ok {
            fmt.Printf("%d\n", v)
        }   
    }   
}

ok是bool型別得,它代表判斷的結果true或者false。如果是true,那麼被判斷的值將會被自動轉換為[]string,並賦值給變數value,否則value將被賦值為nil。ok也可以沒有,斷言表示式的結果,可以只賦給一個變數value,但是這種情況,如果判斷為否就會引發異常,panic(執行時丟擲的異常),除非顯式地恢復這種恐慌,否則它會使go程式崩潰並停止。所以,在一般情況下,應該使用帶ok變數的寫法。

型別斷言
型別斷言表示式的語法形式是x.(T),其中x代表要被判斷型別的值,這個值當下必須是介面型別的,具體是哪個介面型別無所謂。上面的container變數型別不是任何的介面型別時,應該把它轉成某個介面型別的值。如果container時某個介面型別了,那麼斷言表示式就可以式container.([]string)。
go語言中,interface{}代表空介面,任何型別都是它的實現型別。任何型別的值都可以很方便地被轉化成空介面的值。一對不包裹任何東西的花括號,除了可以代表空的程式碼塊之外,還可以用於表示不包含任何內容的資料結構(或者說資料型別)。struct{},代表了不包含任何欄位和方法的、空的結構體型別。而空介面interface{}則表達了不包含任何方法定義的、空的介面型別。一些集合類的資料型別來說,{}還可以用來表達其值不包含任何元素,比如空的切片值[]string{},以及空的字典值map[int]string{}。

型別轉換
型別轉換表示式的語法形式T(x)。其中x可以是一個變數,也可以是一個代表值的字面量(如1.2和struct{}),還可以是一個表示式。如果是表示式,那麼該表示式的結果只能是一個值,而不能是多個值。在這個上下文中,x可以被叫做源值,它的型別就是源型別,而那個T代表的型別就是目標型別。
interface{}(container)
源值是container變數,目標型別是interface{}