我写了代码:
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 {})。有人可以解释一下为什么吗?另外,有什么解决方法?
reflect.TypeOf(v)
[]interface {}
cannot range over v (type interface {})
在类型开关中,如果您希望访问强制转换为适当类型的变量,则只需使用类似的命令,switch x := v.(type)并且在每种情况下,开关x将具有适当的值。规范中有一个例子。您甚至可以这样做,switch v := v.(type)并且在switch语句中将有v的阴影版本。
switch x := v.(type)
x
switch v := v.(type)
例如:
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) }
playground
还要注意,fmt.Printf当您只想打印变量的类型时,可以只使用“%T” 代替(直接)使用reflect包。
fmt.Printf
最后,请注意,如果您有多个非默认子句,则需要使用类型开关,但是,例如在您的示例中,如果您确实只对一种类型感兴趣,则应该执行以下操作:
if x, ok := v.([]interface{}); ok { fmt.Printf("got %T\n", x) for i, e := range x { fmt.Println(i, e) } } else { fmt.Printf("I don't know how to handle %T\n", v) }