Насколько безопасен слайс в отношении concurrency

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

Ответ

Слайсы в Go небезопасны для конкурентного доступа. При одновременной записи и чтении из разных горутин могут возникать race condition, data race и даже паники.

Основные проблемы:

  1. Data race - одновременная запись и чтение без синхронизации
  2. Переаллокация - append может вызвать переаллокацию, что приведёт к неожиданным результатам
  3. Инвалидация указателей - при изменении capacity старые указатели могут стать невалидными

Пример опасного кода:

var s []int
go func() { s = append(s, 1) }()
go func() { s = append(s, 2) }()

Решение: используйте мьютексы или каналы для синхронизации:

var (
    s []int
    mu sync.Mutex
)

mu.Lock()
s = append(s, 1)
mu.Unlock()

Для высоконагруженных сценариев лучше использовать sync.Map или другие thread-safe структуры.