Ответ
Нет, запись в слайс из нескольких горутин небезопасна без синхронизации. Слайс в Go — это структура с указателем на массив, длиной и ёмкостью. Конкурентная модификация может привести к гонкам данных и повреждению структуры слайса.
Пример проблемы:
var s []int
for i := 0; i < 10; i++ {
go func() {
s = append(s, 1) // Data race!
}()
}
Решение:
- Использовать
sync.Mutexдля защиты записи:
var mu sync.Mutex
mu.Lock()
s = append(s, 1)
mu.Unlock()
- Каналы (каналы по умолчанию потокобезопасны):
ch := make(chan int)
go func() { ch <- 1 }()
s = append(s, <-ch)
sync/atomicдля простых случаев (но не для слайсов напрямую).