Слайс — не массив, а небольшая структура:
type slice struct {
array unsafe.Pointer
len int
cap int
}
array указывает на массив с данными, len хранит текущую длину, cap — доступную вместимость. Отсюда две важные особенности.
1️⃣ Срез не копирует данные
s2 := s1[1:3]
s1 и s2 смотрят в один массив. Изменение элемента через s2 может быть видно через s1.
2️⃣ А вот append может разорвать эту связь
Пока хватает cap → запись идёт в существующий массив.
Не хватает cap → выделяется новый backing array, элементы копируются туда.
Поэтому два слайса могут сначала делить память, а после append — уже нет. И наоборот, append без реаллокации способен неожиданно изменить данные, доступные через соседний слайс.
💡 Есть способ контролировать такое поведение через s[low:high:max] — разберём отдельно.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep