Я новичок в го и просматриваю книгу под названием «Изучение го», изданную O'reilly. Читая о срезах, ниже приводится утверждение:
Чтобы увеличить размер среза, начиная с Go 1.14 правило состоит в том, что он удваивает емкость до достижения размера 1024, а затем увеличивается на 25% после этого».
Я написал этот код Go, чтобы доказать это.
package main
import "fmt"
func main() {
var length uint16 = 1024
var x []int
for i := 0; i < int(length); i++ {
x = append(x, i)
fmt.Printf("\nLength is %d. Capacity is %d", len(x), cap(x))
}
}
Доказано, что от 0 до len(x)==512 среда выполнения Go удваивает емкость (также известную как размер). Но здесь начинается самое интересное для меня: когда len(x) >= 512, я ожидал, что емкость будет 1024, поскольку 512*2 = 1024. Однако результат ниже:
Length is 513. Capacity is 848
Таким образом, это примерно 65-процентное увеличение. Может кто-то объяснить это мне?
начиная с версии 1.14
Go 1.20 только что был выпущен (выпущен 01 февраля 2023 г.). Начата работа над Go 1.21. Прочтите исходный код Go, чтобы увидеть изменения по сравнению с Go 1.14 (выпущенным 25 февраля 2020 г.).
Например,
go/src/runtime/slice.go:
// Transition from growing 2x for small slices
// to growing 1.25x for large slices. This formula
// gives a smooth-ish transition between the two.
время выполнения: сделайте формулу роста среза более плавной (Совершено в понедельник, 27 сентября, 20:53:51 2021 г.):
Instead of growing 2x for < 1024 elements and 1.25x for >= 1024 elements,
use a somewhat smoother formula for the growth factor. Start reducing
the growth factor after 256 elements, but slowly.
starting cap growth factor
256 2.0
512 1.63
1024 1.44
2048 1.35
4096 1.30
(Note that the real growth factor, both before and now, is somewhat
larger because we round up to the next size class.)
Ответ в том, что он изменился с версии go1.14 и может измениться снова. Фактическое поведение зависит от реализации.