Переменные a
и b
выделены и инициализируется с нулевыми значениями их соответствующего типа (что 0
в случае int
) прежде, чем любой из функций запуска на выполнение, по этой линии:
var a, b int
Что может измениться - порядок новых значений присваивается им в функции f()
.
Цитирование с этой страницы: Happens Before:
В одном goroutine, чтения и записи должны вести себя так, как будто они выполняются в порядке, указанном в программе. То есть, компиляторы и процессоры могут изменять порядок чтения и записи, выполненных в одном канате, только если переупорядочение не изменяет поведение внутри этого goroutine, как определено спецификацией языка. Из-за этого переупорядочения порядок исполнения, наблюдаемый одной горутой, может отличаться от порядка, воспринимаемого другим. Например, если один goroutine выполняет a = 1; b = 2;
, другой может наблюдать обновленное значение b
перед обновленным значением a
.
Присвоение a
и b
может произойти не в порядке их написания, если переназначения их не делает разницы в том же goroutine. Компилятор может их переупорядочить, например, если первое изменение значения b
более эффективно (например, поскольку его адрес уже загружен в регистр). Если изменение порядка присваивания (или может) вызвать проблему в одном и том же goroutine, то, очевидно, компилятору не разрешено изменять порядок. Поскольку gotoutine функции f()
ничего не делает с переменными a
и b
после назначения, компилятор может выполнять задания в любом порядке.
Поскольку в приведенном выше примере синхронизации между двумя goroutines нет, компилятор не прилагает никаких усилий для проверки того, что переупорядочение вызовет проблемы в другой goroutine. Это не обязательно.
Buf, если вы синхронизируете свои goroutines, компилятор удостоверится, что в «точке синхронизации» не будет никаких несоответствий: у вас будет гарантия, что в этот момент оба назначения будут «завершены»; поэтому, если «точка синхронизации» находится перед вызовами print()
, тогда вы увидите напечатанные присвоенные новые значения: 2
и 1
.
Как я понимаю: видимость значения b в g не определяется f. _Inside_ f a задается первым, а затем b и никогда наоборот. – Volker