InterfaceSlice被误用的一种情况

任何类型可以赋值给Interface,这会带来一种误导。

var dataSlice []int = foo()
var interfaceSlice []interface{
     } = dataSlice

报错

cannot use dataSlice (type []int) as type []interface { } in assignment

原因
slice在编译时就需要确定内存布局。下面是interface的底层数据结构,很明显不同于int类型

type = struct runtime.eface {
     
    runtime._type *_type;
    void *data;
}

这就造成了[]int和[]interface{}内存布局的差异,导致上面的dataSlice 不能赋值给interfaceSlice 。

正确的做法

var dataSlice []int = foo()
var interfaceSlice []interface{
     } = make([]interface{
     }, len(dataSlice))
for i, d := range dataSlice {
     
	interfaceSlice[i] = d
}

你可能感兴趣的:(InterfaceSlice被误用的一种情况)