一尘不染

遍历接口数组

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 how to handle this.")
        }

现在,我reflect.TypeOf(v)将类型输出为[]interface {}。但是,我无法遍历接口数组。我遇到错误:cannot range over v (type interface {})。有人可以解释一下为什么吗?另外,有什么解决方法?


阅读 205

收藏
2020-07-02

共1个答案

一尘不染

类型开关中,如果您希望访问强制转换为适当类型的变量,则只需使用类似的命令,switch x := v.(type)并且在每种情况下,开关x将具有适当的值。规范中有一个例子。您甚至可以这样做,switch v := v.(type)并且在switch语句中将有v的阴影版本。

例如:

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包。

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

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)
}
2020-07-02