切片中的接口转换

时间:2018-06-19 10:01:51

标签: go interface type-conversion slice

我写了这个示例代码(https://play.golang.org/p/u_oz5X4aU07):

func main() {
    var obj interface{}
    json.Unmarshal([]byte("[[1,2],[3,4]]"), &obj)
    val := obj.([][]int)
    fmt.Println(val)
}

为什么我收到错误:

  

接口转换:interface {}是[] interface {},而不是[] [] int

是否有一种简单的方法可以在一片切片中转换obj?

这段代码有效,但我想要更紧凑和高效的东西。

    var val [][]float64
    for r, v := range obj.([]interface{}) {
        val = append(val,nil)
        for _, w := range v.([]interface{}) {
            val[r] = append(val[r], w.(float64))
        }
    }

1 个答案:

答案 0 :(得分:0)

不,最终您将不得不遍历两个切片!

您可以在这里阅读为什么不能仅将一个用作另一个:

https://research.swtch.com/interfaces

此答案也可能有用:

Why golang struct array cannot be assigned to an interface array

本质上是因为接口存储为2个单词对,一个定义了类型,一个定义了值。

您必须通过访问for-range循环中的所有值来手动转换为所需的类型。