说我有以下代码:
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
或类型开关是要走的路?
答案 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")
}
答案 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 ,否则请使用开关以提高可读性。