【问题标题】:How to iterate over nested list of interfaces in Golang? [duplicate]如何迭代Golang中的嵌套接口列表? [复制]
【发布时间】:2021-09-08 15:23:37
【问题描述】:

我有以下用 Golang 编写的代码:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var i []interface{}
    var j []interface{}
    var k []interface{}
    
    i = append(i, 1)
    i = append(i, "Test")
    
    j = append(j, 2)
    j = append(j, "Try")
    
    k = append(k, i)
    k = append(k, j)
    
    
    for _, outer := range k {
        fmt.Println(reflect.TypeOf(outer))
        //for _, inner := range outer {
        //  fmt.Println(inner)
        //}
    }
}

这段代码的输出表明outer是一个类型:

[]interface{}
[]interface{}

但是,当我尝试迭代外部时,它给了我错误:

cannot range over outer (type interface {})

如何从嵌套的接口列表中检索值?任何帮助将不胜感激。

【问题讨论】:

  • 使用类型断言:outer.([]interface{})interface{} 值中获取切片,您可以对其进行迭代。
  • 感谢@icza 的帮助。我现在可以遍历接口列表了。
  • 旁注:如果您知道k 将包含切片,您应该考虑将其更改为类型[][]interface{},那么您不需要类型断言。

标签: go


【解决方案1】:

为了从嵌套接口中检索值,您可以在将其转换为切片后对其进行迭代。我重新创建了您的程序,如下所示:

package main

import (
    "fmt"
)

func main() {
    var i []interface{}
    var j []interface{}
    var k []interface{}

    i = append(i, 1)
    i = append(i, "Test")

    j = append(j, 2)
    j = append(j, "Try")

    k = append(k, i)
    k = append(k, j)

    for _, outer := range k {

        fmt.Println(outer.([]interface{}))
        for z := 0; z < len(outer.([]interface{})); z++ {
            fmt.Println(outer.([]interface{})[z])
        }

    }
}

输出:

[1 Test]
1
Test
[2 Try]
2
Try

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2013-03-21
    • 2011-03-25
    相关资源
    最近更新 更多