Go - 如何检查类型是否相等?

时间:2015-04-04 09:32:40

标签: 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

或类型开关是要走的路?

3 个答案:

答案 0 :(得分:6)

类型断言返回两个值..第一个是转换后的值,第二个是bool,表明类型断言是否正常工作。

所以你可以这样做:

_, 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

答案 1 :(得分:2)

我只是想出了另一种基于this的方法:

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

答案 2 :(得分: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
}

如果您需要检查一种类型,请使用简单的 if ,否则请使用开关以提高可读性。