InterfaceSlice
2018-03-24 本文已影响37人
绝望的祖父
在Go语言中,鉴于你可以将任何类型的变量分配给interface{}
,因此通常人们会写出下面的代码:
var dataSlice []int = foo()
var interfaceSlice []interface{} = dataSlice
但是如果你编译这段代码,编译器会提示如下错误:
cannot use dataSlice (type []int) as type []interface { } in assignment
这是为什么呢?
原因
这有两个主要的原因。
首先,一个类型为[]interface{}
的变量并不是一个interface
,而是一个切片类型,只是切片中的元素正好是interface{}
。但即便如此,大家可能会说,[]interface{}
这个类型的意义不是很明确么,就是代表一个泛型切片。
那么事实的确如此么?类型为[]interface {}
的变量具有特定的内存布局,在编译时已知。每一个interface{}
类型占用两个字(一个用于存储interface
包含的类型,另一个用于存储类型的值或指针)。因此,长度为N并且类型为[]interface{}
的切片大小为N*2个字长。
这与类型为[]MyType
且长度相同的数据块不同。它的大小将是N * sizeof(MyType)
。
因此,你不能将一个类型为[]MyType
的变量分配给[]interface{}
,它们背后的数据结构是不一样的。