Ответ
Мутировать слайс безопасно, но с оговорками. Слайс — это ссылочный тип, поэтому изменения элементов отражаются во всех копиях. Однако при добавлении элементов (append) может произойти реаллокация, и слайс начнёт ссылаться на новый массив.
Пример:
s := []int{1, 2, 3}
s2 := s[:2] // общий базовый массив
s[0] = 9 // изменится и s, и s2
fmt.Println(s, s2) // [9 2 3] [9 2]
s = append(s, 4) // возможна реаллокация
s[0] = 1 // s2 не изменится, если была реаллокация
Основные риски:
- Неожиданные изменения в других слайсах, ссылающихся на тот же массив
- Гонки данных при использовании в горутинах
- Потеря ссылки при
appendс реаллокацией
Для безопасного мутирования:
- Используйте копирование (
copy()) при необходимости изоляции - Контролируйте capacity, чтобы избежать неожиданных реаллокаций
- Синхронизируйте доступ в concurrent-коде