Безопасно ли мутировать слайс

«Безопасно ли мутировать слайс» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мутировать слайс безопасно, но с оговорками. Слайс — это ссылочный тип, поэтому изменения элементов отражаются во всех копиях. Однако при добавлении элементов (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 не изменится, если была реаллокация

Основные риски:

  1. Неожиданные изменения в других слайсах, ссылающихся на тот же массив
  2. Гонки данных при использовании в горутинах
  3. Потеря ссылки при append с реаллокацией

Для безопасного мутирования:

  • Используйте копирование (copy()) при необходимости изоляции
  • Контролируйте capacity, чтобы избежать неожиданных реаллокаций
  • Синхронизируйте доступ в concurrent-коде