Можно ли писать в слайс конкурентно

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

Ответ

Нет, запись в слайс из нескольких горутин небезопасна без синхронизации. Слайс в Go — это структура с указателем на массив, длиной и ёмкостью. Конкурентная модификация может привести к гонкам данных и повреждению структуры слайса.

Пример проблемы:

var s []int
for i := 0; i < 10; i++ {
    go func() {
        s = append(s, 1) // Data race!
    }()
}

Решение:

  1. Использовать sync.Mutex для защиты записи:
var mu sync.Mutex
mu.Lock()
s = append(s, 1)
mu.Unlock()
  1. Каналы (каналы по умолчанию потокобезопасны):
ch := make(chan int)
go func() { ch <- 1 }()
s = append(s, <-ch)
  1. sync/atomic для простых случаев (но не для слайсов напрямую).