我对接口变量的.(类型)语法很困惑.有可能像这样使用它:
var a,b interface{}
// some code
if first.(type) == second.(type) {
}
Run Code Online (Sandbox Code Playgroud)
或者是reflect.TypeOf()唯一的选项来检查a和b的基础类型是否是相同的类型?我在上面的代码中做了什么比较?
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)
真正
小智 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)
任何一个都可以工作,并且不会像其他一些建议那样尝试使用任何类型的断言时引起恐慌。