170 похожих чатов

Добрый день! Господа, подскажите пожалуйста по шагам что тут происходит x

:= []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 которое должно вставляться в новый слайс(массив)?

13 ответов

27 просмотров

Если заменить второе на 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]

Dmitriy-Kovbasin Автор вопроса
ShiroNoHaga
Если заменить второе на x := []int{} x = append...

я же правильно понимаю что после увеличения cap они у нас должны сомтреть на разные массивы уже? )

капасити не на 1 увеличивается, подсказка =)

в 2 раза до того момента пока размер слайса не станет больше 1024 элементов, после этого будет увеличиваться примерно на 25%.

Alexey Ermakov
капасити не на 1 увеличивается, подсказка =)

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. А в последней строке мы добавили четвертое значение в слайс Х, в связи с чем оно поменялось в массиве и как результат в слайсе У. Вроде так...

Anton Russinov
в 2 раза до того момента пока размер слайса не ста...

там, вроде, “плавно” меняется размер увеличения?

Alexey Ermakov
там, вроде, “плавно” меняется размер увеличения?

c 1.18 поменяли немного этот механизм сейчас не вспомню как это сделано теперь, то что я описал было до 1.18

Anton Russinov
c 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.

Да Но это не прямая перезапись Мне кажется это разное

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта