美文网首页
InterfaceSlice

InterfaceSlice

作者: 绝望的祖父 | 来源:发表于2018-03-24 17:56 被阅读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{},它们背后的数据结构是不一样的。

相关文章

  • InterfaceSlice

    在Go语言中,鉴于你可以将任何类型的变量分配给interface{},因此通常人们会写出下面的代码: 但是如果你编...

网友评论

      本文标题:InterfaceSlice

      本文链接:https://www.haomeiwen.com/subject/nkzqcftx.html