Golang不會自動把slice轉換成interface{}類型的slice


例子

我們時常會寫一些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

原因

  1. []A 不是一個interface,它只是一個slice,並且剛剛好元素類型是A。
  2. []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
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM