迭代一系列接口

时间:2015-03-10 01:17:40

标签: 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 {})。有人可以解释一下为什么?另外,解决方法是什么?

2 个答案:

答案 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)
}

playground

另请注意,当您只想打印变量类型时,可以使用“{T}”而不是(直接)使用“反射包”。

答案 1 :(得分:0)

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

虽然这可能不适用于您的循环,除非事先了解您的数据。