我可以在Golang中将变量类型与。(类型)进行比较吗?

时间:2016-01-15 21:50:41

标签: go types

我对接口变量的。(类型)语法很困惑。有可能像这样使用它:

var a,b interface{}
// some code
if first.(type) == second.(type) {
}

或者reflect.TypeOf()是检查a和b的基础类型是否是同一类型的唯一选项?我在上面的代码中做了什么比较?

4 个答案:

答案 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)")
    }
 }

... 而且您可以在任何界面中使用所有类型...