На уровне пакета зависимости инициализации определяют порядок оценки отдельных выражений инициализации в объявлениях переменных. В противном случае при оценке операндов выражения, присваивания или оператора возврата все вызовы функций, вызовы методов и операции связи оцениваются в лексическом порядке слева направо.
Например, в (локально-функциональном) назначении
y[f()], ok = g(h(), i()+x[j()], <-c), k()
вызовы функций и связь происходят в порядке f(), h(), i(), j(), <-c, g() и k(). Однако порядок этих событий по сравнению с оценкой и индексированием x и оценкой y не указан.
a := 1
f := func() int { a++; return a }
x := []int{a, f()} // x может быть [1, 2] или [2, 2]: порядок вычисления между a и f() не указан
m := map[int]int{a: 1, a: 2} // m может быть {2: 1} или {2: 2}: порядок оценки между двумя назначениями карты не указан
n := map[int]int{a: f()} // n может быть {2: 3} или {3: 3}: порядок вычисления между ключом и значением не указан
На уровне пакета зависимости инициализации переопределяют правило слева направо для отдельных выражений инициализации, но не для операндов в каждом выражении:
var a, b, c = f() + v(), g(), sqr(u()) + v()
func f() int { return c }
func g() int { return a }
func sqr(x int) int { return x*x }
// функции u и v не зависят от всех других переменных и функций
Вызовы функций происходят в порядке u(), sqr(), v(), f(), v() и g().
Операции с плавающей точкой в пределах одного выражения оцениваются в соответствии с ассоциативностью операторов. Явные скобки влияют на оценку, переопределяя ассоциативность по умолчанию.
В выражении x + (y + z) сложение y + z выполняется перед добавлением x.
Читайте также:
- Спецификация Go: первичные выражения (primary expressions), селекторы (selectors)
- Спецификация Go: выражения (expressions) - операнды, квалифицированные идентификаторы
- Спецификация Go: объявления и области видимости
Комментариев нет:
Отправить комментарий