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

use*_*168 5 types go

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

var a,b interface{}
// some code
if first.(type) == second.(type) {
}
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*ith 8

someInterface.(type)仅使用在型的开关.事实上,如果你试图运行它,你会在错误消息中看到它.

func main() {
    var a, b interface{}
    a = 1
    b = 1

    fmt.Println(a.(type) == b.(type))
}
Run Code Online (Sandbox Code Playgroud)

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))
}
Run Code Online (Sandbox Code Playgroud)

真正

  • 请注意,如果两个变量都不是`int`类型,则第二个示例将会发生混乱. (8认同)
  • 问题是关于比较类型,而不是比较相同类型的值。 (7认同)

jac*_*cob 5

您需要指定类型。该语法用于对接口进行类型声明,而不是对特定类型进行检查。您将不得不使用reflect.TypeOf它。

您可以查看此答案以正确使用类型断言。


小智 5

请试试这个:

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)")
    }
 }
Run Code Online (Sandbox Code Playgroud)

...并且您可以用于任何界面中的所有类型...


小智 5

func isType(a, b interface{}) bool {
    return fmt.Sprintf("%T", a) == fmt.Sprintf("%T", b)
}
Run Code Online (Sandbox Code Playgroud)

"%T"fmt 选项在幕后使用反射,这将使上述语句实际上与以下语句相同:

func isType(a, b interface{}) bool {
    return reflect.TypeOf(a) == reflect.TypeOf(b)
}
Run Code Online (Sandbox Code Playgroud)

任何一个都可以工作,并且不会像其他一些建议那样尝试使用任何类型的断言时引起恐慌。