go - slice of slice 中的接口(interface)转换

标签 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 conversion: interface {} is []interface {}, not [][]int

有没有一种简单的方法可以将obj转换成一片slice?

此代码有效,但我想要更紧凑和高效的代码。

    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))
        }
    }

最佳答案

不,最终您将不得不遍历这两个 slice !

您可以在此处阅读为什么不能将一个用作另一个:

https://research.swtch.com/interfaces

这个答案也可能有用:

Why golang struct array cannot be assigned to an interface array

本质上,这是因为接口(interface)存储为 2 个词对,一个定义类型,一个定义值。

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

关于go - slice of slice 中的接口(interface)转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925632/

相关文章:

arrays - Golang 对二维数组进行排序

Golang Mutex 锁定特定变量/映射

unit-testing - 来自测试, panic : sql: connection returned that was never out

java - 使用多个接口(interface)的最佳方式是什么?

Javascript:将字符串转换为对象数组?

go - JWT 签名方法 HS256 Golang

interface - 如何在序列图中表示实现接口(interface)

Java接口(interface)最佳实践

Rust Trait 对象转换

Android Google Firebase 数据库对象值