2 回答

TA貢獻1943條經驗 獲得超7個贊
這取決于數組中存儲的元素的大小
可以在這里看到實現:
https://github.com/golang/go/blob/master/src/runtime/slice.go
但正如你在回顧歷史時所看到的那樣,它不能隨著時間的推移而保持不變。
這也可以解釋您可能注意到的不同 Go 版本的差異。
進行一些測試,顯示 0 大小的結構如何僅將容量增加 1 個元素,并且 int 或 string 將在每次增長時重復,而 3 字節結構在每次增長時“大致”加倍。
您可以使用不同的類型執行這樣的代碼,以查看這些不同情況的實際情況:
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))
}
}
游樂場展示了上述案例:
https://play.golang.org/p/OKtCFskbp2t

TA貢獻1812條經驗 獲得超5個贊
根據Go slice內部的信息,append的實現行為如下。
它只是的倍數(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 關注
- 153 瀏覽
添加回答
舉報