Ответ
Основные подводные камни слайсов в Go:
- Изменение базового массива
Слайсы ссылаются на один массив. Изменения в одном слайсе могут повлиять на другой:
a := []int{1, 2, 3}
b := a[:2]
b[0] = 9 // a[0] тоже изменится!
- Утечки памяти
Слайс держит ссылку на весь массив, даже если нужна только часть:
bigData := make([]byte, 1<<20) // 1MB
smallPart := bigData[:10] // держит ссылку на весь 1MB
- Append и capacity
При добавлении элементов может создаться новый массив:
s := []int{1, 2, 3}
s = append(s, 4) // может изменить базовый массив
- Сравнение с nil
Пустой слайс != nil, если создан через make:
var s1 []int // s1 == nil
s2 := []int{} // s2 != nil
s3 := make([]int, 0) // s3 != nil
- Передача в функции
Слайсы передаются по значению (копируется заголовок), но данные остаются общими:
func modify(s []int) {
s[0] = 100 // изменит оригинал
s = append(s, 5) // не изменит оригинал, если не вернуть
}