2015-04-04 40 views
1

說我有下面的代碼:Go - 如何檢查類型是否相等?

var x interface{} 
y := 4 
x = y 
fmt.Println(reflect.TypeOf(x)) 

這將打印INT作爲類型。我的問題是我該如何測試這種類型?我知道有該類型開關,它這樣做,所以我可以做的:

switch x.(type) { 
case int: 
    fmt.Println("This is an int") 
} 

但如果我只是想檢查只是一種特定類型的開關好像錯誤的工具。有沒有更直接的方法可以做到這一點

reflect.TypeOf(x) == int 

或者是類型切換的路要走嗎?

回答

6

類型斷言返回兩個值。第一個是轉換後的值,第二個是布爾型,指示類型斷言是否正常工作。

所以,你可以這樣做:

_, ok := x.(int) 

if ok { 
    fmt.Println("Its an int") 
} else { 
    fmt.Println("Its NOT an int") 
} 

..或者,速記:

if _, ok := x.(int); ok { 
    fmt.Println("Its an int") 
} 

See it in the playground

+0

Tks!在同一時間自己找到相同的答案:) – IamNaN 2015-04-04 09:45:31

1

我只是想出了這樣做基於this的另一種方式:

if _, ok := x.(int); ok { 
    fmt.Println("This is an int") 
} 
+1

這將工作得很好,如果你需要一個特定的類型。如果你想在多種類型之間做出決定,一個類型轉換當然更好。 – 2015-04-04 09:41:40

+0

啊......你一定已經像我一樣回答了。哦,很高興你找到你的答案:) – 2015-04-04 09:42:35

0

Effective Go你可以找到一個非常簡單的例子,你想要達到的目標。

var t interface{} 
t = functionOfSomeType() 

switch t := t.(type) { 
default: 
    fmt.Printf("unexpected type %T", t)  // %T prints whatever type t has 
case bool: 
    fmt.Printf("boolean %t\n", t)    // t has type bool 
case int: 
    fmt.Printf("integer %d\n", t)    // t has type int 
case *bool: 
    fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool 
case *int: 
    fmt.Printf("pointer to integer %d\n", *t) // t has type *int 
} 

如果你有,你必須檢查單式,使用簡單如果,否則使用一個開關更好的可讀性。

+1

根據政策,請將鏈接文件的相關部分複製到答案中。 – fuz 2015-04-04 12:00:13

+0

@FUZxxl謝謝您的建議。 – 2015-04-10 10:12:46