Чтение и запись обычных переменных без синхронизации не создают happens-before. Даже если одна горутина записала значение, другая может не увидеть его - или увидеть частично записанное значение.
var x, y int
// Горутина 1
go func() {
x = 1
y = 2
}()
// Горутина 2 - может увидеть:
// x=0,y=0 (еще не записано)
// x=0,y=2 (переупорядочивание)
// x=1,y=0 или x=1,y=2
fmt.Println(x, y) // data race!
Операции с happens-before гарантией:
ch <- v / <-ch - канальные операцииmu.Lock() / mu.Unlock() - мьютексыwg.Done() / wg.Wait() - WaitGroupatomic.Store / atomic.Load - атомарные операцииonce.Do(f) - однократное выполнение