问题描述
我正在尝试实现以下目标.
程序包主要进口 ("fmt")输入MyStruct struct {值int}func main(){x:= [] MyStruct {MyStruct {价值:5},MyStruct {价值:6},}var y [] interface {}y = x//这会引发编译时错误_,_ = x,y}
这会导致编译时错误:
sample.go:21:不能在分配中使用x(类型[] MyStruct)作为类型[] interface {}
为什么这不可能?如果没有,则没有其他方法可以在Golang中保存通用对象数组?
接口{}
存储为两个单词对,一个单词描述基础类型信息,另一个单词描述其中的数据.界面:
https://research.swtch.com/godata
您不能将一个转换为另一个,因为它们在内存中没有相同的表示形式.
https://golang.org/doc/faq#convert_slice_of_interface
要回答您的最后一个问题,您可以使用 [] interface
(这是接口的一部分),其中每个接口都如上所示,或者只是 interface {}
该接口中保留的基础类型为 [] MyStruct
各种接口{}y = x
或
y:= make([] interface {},len(x))对于i,v:=范围x {y [i] = v}
I'm trying to achieve something as below.
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
}
This gives a compile time error:
sample.go:21: cannot use x (type []MyStruct) as type []interface {} in assignment
Why is this not possible?.If not is there any other way to hold generic object arrays in Golang?
interface{}
is stored as a two word pair, one word describing the underlying type information and one word describing the data within that interface:
https://research.swtch.com/interfaces
Here we see the first word stores the type information and the second the data within b
.
Struct types are stored differently, they do not have this pairing. Their fields of a struct are laid out next to one another in memory.
https://research.swtch.com/godata
You cannot convert one to the other because they do not have the same representation in memory.
https://golang.org/doc/faq#convert_slice_of_interface
To answer your last question, you could have []interface
which is a slice of interfaces, where each interface is represented as above, or just interface{}
where the underlying type held in that interface is []MyStruct
var y interface{}
y = x
or
y := make([]interface{}, len(x))
for i, v := range x {
y[i] = v
}
这篇关于为什么Golang结构数组无法分配给接口数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!