Ответ
Использование обычных переменных для обмена данными между горутинами небезопасно из-за race condition (гонки данных). Горутины выполняются конкурентно, и без синхронизации возможны конфликты при одновременном чтении/записи.
Пример проблемы:
var counter int
func increment() {
counter++
}
func main() {
for i := 0; i < 1000; i++ {
go increment()
}
time.Sleep(time.Second)
fmt.Println(counter) // Результат непредсказуем
}
Для безопасного обмена данными используйте:
- Каналы (chan)
- Мьютексы (sync.Mutex)
- Атомарные операции (sync/atomic)
- Примитивы из пакета sync (WaitGroup, RWMutex и др.)