猿问

迭代接口数组

我写的代码:


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 {})。有人可以解释我为什么吗?另外,有什么解决方法?


浮云间
浏览 234回答 2
2回答

慕尼黑的夜晚无繁华

在类型 switch 中,如果您希望访问转换为适当类型的变量,只需使用类似的东西,switch x := v.(type)并且在 switch 的每种情况下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"而不是(直接)使用反射包。最后,请注意,如果您有多个非默认子句,则需要类型切换,但如果如您的示例所示,您确实只有一种类型感兴趣,那么您应该执行以下操作: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)}

绝地无双

您始终可以使用v.([]interface{}). 我在尝试解析必须被视为接口的异类 json 对象时遇到了同样的问题。尽管除非您事先了解数据,否则这在您的循环中可能不起作用。
随时随地看视频慕课网APP

相关分类

Go
我要回答