为什么golang struct array不能分配给接口数组

时间:2017-06-02 02:30:04

标签: go

我正在努力实现以下目标。

package main

import (
    "fmt"
)

type MyStruct struct {
    Value int
}

func main() {
    x := []MyStruct{
        MyStruct{
            Value : 5,
        },
        MyStruct{
            Value : 6,
        },
    }
    var y []interface{}
    y = x // This throws a compile time error

    _,_ = x,y
}

这会产生编译时错误:

sample.go:21: cannot use x (type []MyStruct) as type []interface {} in assignment

为什么这不可能?。如果没有其他方法在Golang中保存通用对象数组?

1 个答案:

答案 0 :(得分:3)

interface{}存储为双字对,一个字描述基础类型信息,一个字描述该接口内的数据:

enter image description here

https://research.swtch.com/interfaces

在这里,我们看到第一个词存储了类型信息,第二个词存储了b中的数据。

结构类型的存储方式不同,它们没有这种配对。他们的结构域在内存中彼此相邻。

enter image description here

https://research.swtch.com/godata

您无法将一个转换为另一个,因为它们在内存中的表示形式不同。

  

必须将元素分别复制到目的地   切片。

https://golang.org/doc/faq#convert_slice_of_interface

要回答您的上一个问题,您可以使用[]interface这是一个接口片段,其中每个接口都表示如上,或仅interface{},其中该接口中保存的基础类型为[]MyStruct 1}}

var y interface{}
y = x 

y := make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}