我是Go语言的新手,对本教程中的示例代码非常困惑。这是代码及其输出:
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
return lim
}
func main() {
fmt.Println(pow(3, 3, 10), pow(4, 3, 20))
}
运行它时,此代码的输出为:
27 >= 10
64 >= 20
10 20
这对我来说很奇怪!我希望得到这样的输出:
27 >= 10
10
64 >= 20
20
有人可以帮助我了解这段代码中Println发生的情况吗?
答案 0 :(得分:0)
在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
会导致其他内容被打印。