例子
我們時常會寫一些interface,例如:
type A interface{
Print()
}
type B struct {
}
func (b *B) Print() {
fmt.Println("Here is *B")
}
賦值的時候:
var a A
a = &B{}
誒,這樣看視乎沒什么問題,但是我們沒有辦法避免使用數組,然后順手就寫了這樣的代碼
var aa []A
aa = make([]*B, 10)
好的,現在翻車了,會得到一個這樣的報錯:
cannot use make([]*B, 10) (type []*B) as type []A in assignment
原因
- []A 不是一個interface,它只是一個slice,並且剛剛好元素類型是A。
- []A 有自己特殊的內存分布,每一個interface{}有兩個字節,一個是存儲他是什么類型,另一個存儲數據或者指針來指向他。因此,一個[]A是一塊N*2的數據,但是[]*B是一塊N*(sizeof(*B))的數據。
如何去實現
bb := []*B{&B{}, &B{}}
var aa []AA = make([]AA, len(bb))
for i, d := range bb {
aa[i] = d
}