:= []int{}
x = append(x, 1)
x = append(x, 2)
y := append(x, 5)
x = append(x, 4)
fmt.Println(x, y)
Вывод 124 125
x := []int{}
x = append(x, 1)
x = append(x, 2)
x = append(x, 3)
y := append(x, 5)
x = append(x, 4)
fmt.Println(x, y)
Вывод: 1234 1234
Понятно что под капотом слайса происходит увеличение cap и создание нового массива, но куда пропадает само значение 5 которое должно вставляться в новый слайс(массив)?
Если заменить второе на x := []int{} x = append(x, 1) x = append(x, 2) x = append(x, 3) y := append(x, 5) fmt.Println(x, y) x = append(x, 4) fmt.Println(x, y) То становится ещё интересней ) // [1 2 3] [1 2 3 5] // [1 2 3 4] [1 2 3 4]
я же правильно понимаю что после увеличения cap они у нас должны сомтреть на разные массивы уже? )
капасити не на 1 увеличивается, подсказка =)
в 2 раза до того момента пока размер слайса не станет больше 1024 элементов, после этого будет увеличиваться примерно на 25%.
SliceX - [1] lenX - 1 capX - 1 SliceX - [1 2] lenX - 2 capX - 2 SliceX - [1 2 3] lenX - 3 capX - 4 SliceX - [1 2 3] lenX - 3 capX - 4 SliceY - [1 2 3 5] lenY - 4 capY - 4 SliceX - [1 2 3 4] lenX - 4 capX - 4 SliceY - [1 2 3 4] lenY - 4 capY - 4 Это получается они смотрели на один исходный массив просто в слайсе Х 4 элемент не задействован, а в слайс У в четвертый элемент мы записали значение 5. А в последней строке мы добавили четвертое значение в слайс Х, в связи с чем оно поменялось в массиве и как результат в слайсе У. Вроде так...
там, вроде, “плавно” меняется размер увеличения?
c 1.18 поменяли немного этот механизм сейчас не вспомню как это сделано теперь, то что я описал было до 1.18
// Transition from growing 2x for small slices // to growing 1.25x for large slices. This formula // gives a smooth-ish transition between the two. newcap += (newcap + 3*threshold) / 4
Да? Цукалос писал про 1024.
а какая разница-то?
Да Но это не прямая перезапись Мне кажется это разное
Обсуждают сегодня