所以我一直在阅读这两篇文章和这个答案
无法将 string转换为 interface表示需要更改内存布局。
http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in- go表示,了解基本内存可以轻松回答此问题,并且
http://research.swtch.com/interfaces,解释了到底发生了什么。
但是对于我来说,就接口的实现而言,我无法想到一个原因,即为什么无法将[] T强制转换为[] interface。
所以为什么?
文章“ InterfaceSlice ”尝试详细说明:
类型变量[]interface{}不是接口!这是一个切片,其元素类型恰好是interface{}。但是即使这样,也可以说含义很清楚。 好吧 具有类型的变量具有[]interface{}特定的内存布局,在编译时已知。 每个interface{}单词占用两个单词(一个单词表示所包含内容的类型,另一个单词表示所包含的数据或指向它的指针)。结果,长度为N和类型的切片[]interface{}由N * 2个字长的数据块支持。
类型变量[]interface{}不是接口!这是一个切片,其元素类型恰好是interface{}。但是即使这样,也可以说含义很清楚。
[]interface{}
interface{}
好吧 具有类型的变量具有[]interface{}特定的内存布局,在编译时已知。
每个interface{}单词占用两个单词(一个单词表示所包含内容的类型,另一个单词表示所包含的数据或指向它的指针)。结果,长度为N和类型的切片[]interface{}由N * 2个字长的数据块支持。
另请参阅“ golang中的含义是interface{}什么? ”
这与支持具有类型[]MyType和相同长度的切片的数据块不同。它的数据块将是N*sizeof(MyType)字长。 结果是您不能快速将某类型[]MyType的东西分配给某种类型的东西[]interface{};它们背后的数据看起来不同。
这与支持具有类型[]MyType和相同长度的切片的数据块不同。它的数据块将是N*sizeof(MyType)字长。
[]MyType
N*sizeof(MyType)
结果是您不能快速将某类型[]MyType的东西分配给某种类型的东西[]interface{};它们背后的数据看起来不同。
“ 为什么[]string不能[]interface{}在Go中转换为”添加了一个很好的例子:
[]string
// 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!