Ответ
Слайсы в Go небезопасны для конкурентного доступа. При одновременной записи и чтении из разных горутин могут возникать race condition, data race и даже паники.
Основные проблемы:
- Data race - одновременная запись и чтение без синхронизации
- Переаллокация - append может вызвать переаллокацию, что приведёт к неожиданным результатам
- Инвалидация указателей - при изменении 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 структуры.