例子

我们时常会写一些interface,例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

type A interface{

    Print()

}



type B struct {

}



func (b *B) Print() {

    fmt.Println("Here is *B")

}

赋值的时候:

1
2
3
4
5

var a A

a = &B{}

诶,这样看视乎没什么问题,但是我们没有办法避免使用数组,然后顺手就写了这样的代码

1
2
3
4
5

var aa []A

aa = make([]*B, 10)

好的,现在翻车了,会得到一个这样的报错:


cannot use make([]*B, 10) (type []*B) as type []A in assignment

原因

  1. []A 不是一个interface,它只是一个slice,并且刚刚好元素类型是A。

  2. []A 有自己特殊的内存分布,每一个interface{}有两个字节,一个是存储他是什么类型,另一个存储数据或者指针来指向他。因此,一个[]A是一块N*2的数据,但是[]*B是一块N*(sizeof(*B))的数据。

如何去实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

bb := []*B{&B{}, &B{}}

var aa []AA = make([]AA, len(bb))

for i, d := range bb {

	aa[i] = d

}