小编典典

那么内存布局意味着[] T无法在Go中转换为[]接口?

go

所以我一直在阅读这两篇文章和这个答案

无法将 string转换为 interface表示需要更改内存布局。

http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-
go表示,了解基本内存可以轻松回答此问题,并且

http://research.swtch.com/interfaces,解释了到底发生了什么。

但是对于我来说,就接口的实现而言,我无法想到一个原因,即为什么无法将[] T强制转换为[] interface。

所以为什么?


阅读 232

收藏
2020-07-02

共1个答案

小编典典

文章“ InterfaceSlice
”尝试详细说明:

类型变量[]interface{}不是接口!这是一个切片,其元素类型恰好是interface{}。但是即使这样,也可以说含义很清楚。

好吧 具有类型的变量具有[]interface{}特定的内存布局,在编译时已知。

每个interface{}单词占用两个单词(一个单词表示所包含内容的类型,另一个单词表示所包含的数据或指向它的指针)。结果,长度为N和类型的切片[]interface{}由N * 2个字长的数据块支持。

另请参阅“
golang中的含义是interface{}什么?

2个字

这与支持具有类型[]MyType和相同长度的切片的数据块不同。它的数据块将是N*sizeof(MyType)字长。

结果是您不能快速将某类型[]MyType的东西分配给某种类型的东西[]interface{};它们背后的数据看起来不同。


为什么[]string不能[]interface{}在Go中转换为”添加了一个很好的例子:

// imagine this is possible
var sliceOfInterface = []interface{}(sliceOfStrings)
// since it's array of interface{} now - we can do anything
// let's put integer into the first position
sliceOfInterface[0] = 1
// sliceOfStrings still points to the same array, and now "one" is replaced by 1
fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!
2020-07-02