【问题标题】:about golang interface loop关于golang接口循环
【发布时间】:2016-04-18 15:05:50
【问题描述】:

我想打印一个像下面这样复杂的数据集

package main
import (
    "fmt"
    // "reflect"
)

func main() {

    var initData []interface{}
    initData[0] = map[string]interface{}{
        "name": "k1",
        "type": "line",
        "data": []int{1, 2, 3, 4},
    }

    initData[1] = map[string]interface{}{
        "name": "k2",
        "type": "circle",
        "data": []int{11, 12, 13, 14},
    }

    for _, data := range initData {
        for k, v := range data {
            fmt.Println(k)
            for _, sv := range v {
                fmt.Println("  " + sv)
            }
        }

    }

}

但出现错误

./maps-in-maps.go:56: cannot range over data (type interface {})

有什么帮助吗?尝试将接口类型的数据集与数组或切片等可交互的数据集协调一致

【问题讨论】:

    标签: loops go interface


    【解决方案1】:

    您必须首先在每个interface{} 级别键入断言,在这种情况下,在map[string]interface{} 级别使用类型断言,因为我们知道明确的类型和类型开关 检查下一级中每个嵌套值的预期类型。

    initData := []interface{}{
            map[string]interface{}{
                "name": "k1",
                "type": "line",
                "data": []int{1, 2, 3, 4},
            },
    
            map[string]interface{}{
                "name": "k2",
                "type": "circle",
                "data": []int{11, 12, 13, 14},
            },
        }
    
        for _, data := range initData {
            for _, v := range data.(map[string]interface{}) {
                switch t := v.(type) {
                case string, []int:
                    fmt.Println(t)
                default:
                    fmt.Println("wrong type")           
                }
            }
        }
    }
    

    运行游乐场here

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 1970-01-01
      • 2012-01-07
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多