Как компилятор может переупорядочить инструкции?

Senior
152 просмотров
AFK Offer AI

Компилятор Go (и процессор) может менять порядок операций если это не нарушает поведение в рамках одной горутины. Например, два независимых присваивания могут поменяться местами. Для другой горутины это может означать что она увидит новое значение одной переменной, но старое — другой. Поэтому без memory barriers (через sync примитивы) порядок наблюдений не гарантирован.

Следующий вопрос

Найди баг: func getUser() (*User, error) { var u *User; if err := db.Find(&u); err != nil { return u, err }; return u, nil }