Go Memory Model описывает условия, при которых чтение переменной в одной горутине гарантированно видит значение, записанное в другой. Центральное понятие - happens-before: если событие A happens-before события B, то результаты A видны в B.
Операции, создающие happens-before:
Без синхронизации компилятор и процессор могут переупорядочивать операции. Чтение без happens-before может увидеть старое значение или вообще не увидеть запись.
var x int
var done = make(chan struct{})
go func() {
x = 42 // запись
close(done) // happens-before
}()
<-done // гарантированно видим x == 42