为了账号安全,请及时绑定邮箱和手机立即绑定

迭代接口数组

迭代接口数组

Go
浮云间 2021-09-21 15:10:49
我写的代码: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 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

在类型 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)

}


查看完整回答
反对 回复 2021-09-21
?
绝地无双

TA贡献1946条经验 获得超4个赞

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

尽管除非您事先了解数据,否则这在您的循环中可能不起作用。


查看完整回答
反对 回复 2021-09-21
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信