我对接口变量的。(类型)语法很困惑。有可能像这样使用它:
var a,b interface{}
// some code
if first.(type) == second.(type) {
}
或者reflect.TypeOf()是检查a和b的基础类型是否是同一类型的唯一选项?我在上面的代码中做了什么比较?
答案 0 :(得分:8)
someInterface.(type)
仅在类型开关中使用。事实上,如果你试图运行它,你会在错误信息中看到它。
func main() {
var a, b interface{}
a = 1
b = 1
fmt.Println(a.(type) == b.(type))
}
prog.go:10:使用。(类型)外部类型开关
您可以做的是a.(int) == b.(int)
,这与int(a) == int(b)
func main() {
var a, b interface{}
a = 1
b = 1
fmt.Println(a.(int) == b.(int))
}
真
答案 1 :(得分:4)
您需要指定类型。该语法用于使type assertions关于接口,而不是检查特定类型。
您必须使用reflect.TypeOf
。
您可以查看此answer以正确使用类型断言。
答案 2 :(得分:2)
func isType(a, b interface{}) bool {
return fmt.Sprintf("%T", a) == fmt.Sprintf("%T", b)
}
"%T"
fmt 选项在幕后使用反射,这将使上述语句实际上与:
func isType(a, b interface{}) bool {
return reflect.TypeOf(a) == reflect.TypeOf(b)
}
任何一种都行得通,并且不会像其他一些建议那样尝试使用任何类型的断言时引起恐慌。
答案 3 :(得分:1)
请尝试以下操作:
for key, value := range data {
switch v := value.(type) {
case string:
fmt.Println(key, value, "(string)")
case float64:
fmt.Println(key, value, "(float64)")
case []interface{}:
fmt.Println(key, value, "(interface)")
}
}
... 而且您可以在任何界面中使用所有类型...