我写了代码:
switch v.(type) {
case []interface{}:
fmt.Println(reflect.TypeOf(v))
for index, element := range v {
fmt.Println("Inside for")
}
default:
fmt.Println("I don't know how to handle this.")
}
现在,我的reflect.TypeOf(v)
输出的类型为[]interface {}
。但是,我无法迭代接口数组。我遇到了错误:cannot range over v (type interface {})
。有人可以解释一下为什么?另外,解决方法是什么?
答案 0 :(得分:7)
在type switch中,如果您希望访问投放到相应类型的变量,只需使用类似switch x := v.(type)
的内容,并且在每种情况下,交换机x
都具有适当的值。该规范就是一个例子。你甚至可以switch v := v.(type)
,并且在switch语句中会有一个阴影版本的v。
E.g:
switch x := v.(type) {
case []interface{}:
fmt.Printf("got %T\n", x)
for i, e := range x {
fmt.Println(i, e)
}
default:
fmt.Printf("I don't know how to handle %T\n", v)
}
另请注意,当您只想打印变量类型时,可以使用“{T}”而不是(直接)使用“反射包”。
答案 1 :(得分:0)
您始终可以使用v.([]interface{})
。在尝试解析必须被视为接口的异常json对象时遇到了同样的问题。
虽然这可能不适用于您的循环,除非事先了解您的数据。