В Go, как и в подавляющем большинстве современных языков программирования, аргументы вызова функции оцениваются до самого вызова функции. Рассмотрим следующую функцию:
func add(i, j int) int {
return i + j
}
И назовем это так:
func a() int {
return 2
}
func b() int {
return 3
}
// ... somewhere in main()
add(a(), b())
Можно ожидать, что к моменту запуска кода add
значения i
и j
станут известны, верно? Затем вызов вернет 5
, как и ожидалось. Чтобы включить это, компилятор Go организует аргументы add
, а именно a()
и b()
, которые должны быть запущены до запуска самого add
.
То же самое происходит в вашем примере кода с Println
и pow
. Аргументы Println
должны быть оценены до запуска его тела, а оценка pow
приводит к печати других вещей.