文章“ InterfaceSlice ”尝试详细说明:
具有类型的变量[]interface{}
不是接口!它是一个元素类型恰好是 的切片interface{}
。但即便如此,人们可能会说意思很清楚。
嗯,是吗?具有类型的变量具有[]interface{}
特定的内存布局,在编译时已知。
每个interface{}
占用两个单词(一个单词代表所包含内容的类型,另一个单词代表包含的数据或指向它的指针)。因此,长度为 N 且类型[]interface{}
为的切片由 N*2 个字长的数据块支持。
另请参阅“ golang中的含义是什么interface{}
? ”
这与支持具有类型[]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!