147 подписчиков
🏴☠️ После истории со строками следующая типичная ловушка — слайсы. На базовом уровне кажется, что это просто удобный список. Сделал копию, поменял один — ожидаешь, что второй останется прежним. Но в Go всё устроено иначе.
🤓 Слайс — это не сами данные. Это структура, которая указывает на участок массива: указатель, длина и ёмкость.
Поэтому когда вы пишите:
a := []int{1, 2, 3}
b := a
b[0] = 99
оба слайса показывают одно и то же изменение. a и b — разные переменные, но память у них общая.
🦄 Отсюда и все странности, которые ловят почти все:
- меняешь один слайс — меняется другой;
- append иногда создаёт новый массив, а иногда продолжает старый;
- структура со слайсом ведёт себя «не так», когда ты её копируешь;
- отладка превращается в расследование, кто на что ссылается.
🍾И дело не в том, что Go чудит)) Просто модель памяти слайсов не укладывается в голове, пока её не объяснишь себе правильно. Как только начинаешь мыслить не списками, а окнами в массив, всё становится предсказуемым. Появляется понимание, когда данные действительно копируются, а когда ты просто создаёшь ещё одну ссылку на те же байты.
Это уже шаг за пределы базового уровня 💪
Тут начинается тот самый взрослый Go, где ты не просто пишешь код, а понимаешь, как он живёт в памяти ❤️
1 минута
3 апреля