2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
這取決于數(shù)組中存儲(chǔ)的元素的大小
可以在這里看到實(shí)現(xiàn):
https://github.com/golang/go/blob/master/src/runtime/slice.go
但正如你在回顧歷史時(shí)所看到的那樣,它不能隨著時(shí)間的推移而保持不變。
這也可以解釋您可能注意到的不同 Go 版本的差異。
進(jìn)行一些測(cè)試,顯示 0 大小的結(jié)構(gòu)如何僅將容量增加 1 個(gè)元素,并且 int 或 string 將在每次增長(zhǎng)時(shí)重復(fù),而 3 字節(jié)結(jié)構(gòu)在每次增長(zhǎng)時(shí)“大致”加倍。
您可以使用不同的類型執(zhí)行這樣的代碼,以查看這些不同情況的實(shí)際情況:
arr := []struct{}{}
oldCap := 0
for i := 0; i < 100; i++ {
arr = append(arr, struct{}{})
if cap(arr) != oldCap {
oldCap = cap(arr)
fmt.Println("arr", cap(arr))
}
}
游樂(lè)場(chǎng)展示了上述案例:
https://play.golang.org/p/OKtCFskbp2t

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
根據(jù)Go slice內(nèi)部的信息,append的實(shí)現(xiàn)行為如下。
它只是的倍數(shù)(len(source slice) + len(new data)) * 2
func AppendByte(slice []byte, data ...byte) []byte {
? ? m := len(slice)
? ? n := m + len(data)
? ? if n > cap(slice) { // if necessary, reallocate
? ? ? ? // allocate double what's needed, for future growth.
? ? ? ? newSlice := make([]byte, (n+1)*2)
? ? ? ? copy(newSlice, slice)
? ? ? ? slice = newSlice
? ? }
? ? slice = slice[0:n]
? ? copy(slice[m:n], data)
? ? return slice
}
- 2 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)