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{},它们背后的数据结构是不一样的。

上一篇 下一篇

猜你喜欢

热点阅读