Go 在接口数组上迭代

Go 在接口数组上迭代,go,Go,我写了代码: 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

我写了代码:

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)
将类型输出为
[]接口{}
。但是,我无法遍历接口数组。我遇到了错误:
不能覆盖v(类型接口{})
。有人能解释一下为什么吗?另外,解决方法是什么?

在a中,如果您希望访问铸造到适当类型的变量,只需使用类似于
开关x:=v.(类型)
的东西,并且在开关的每种情况下
x
都将具有适当的值。规范中有一个例子。您甚至可以执行
switch v:=v.(type)
,并且在switch语句中会出现v的阴影版本

例如:

开关x:=v(类型){
案例[]接口{}:
fmt.Printf(“获得%T\n”,x)
对于i,e:=范围x{
fmt.Println(i,e)
}
违约:
fmt.Printf(“我不知道如何处理%t\n”,v)
}

还请注意,当您只想打印变量类型时,您可以将“%T”与
fmt.Printf
一起使用,而不是(直接)使用reflect包

最后,请注意,如果您有多个非默认子句,则类型开关是您想要的,但是,如您的示例所示,如果您确实只有一个您感兴趣的类型,那么您应该执行以下操作:

如果x,ok:=v.([]接口{});嗯{
fmt.Printf(“获得%T\n”,x)
对于i,e:=范围x{
fmt.Println(i,e)
}
}否则{
fmt.Printf(“我不知道如何处理%t\n”,v)
}

您可以始终使用
v.([]接口{})
。我在尝试解析必须作为接口处理的异构json对象时遇到了同样的问题


尽管这在你的循环中可能不起作用,除非你事先对你的数据有所了解。

我只是将我的
开关v.(type)
更改为
开关vv:=v.(type)
,当我在vv范围内时,一切都开始正常工作。无论如何,谢谢。我应该在我的回答中注意到,如果开关中只有两种情况(即,您只处理一种类型),那么您真的应该使用
vv,ok:=v.([]接口{})
,然后只检查
ok
。类型开关用于处理多个类型。