我正在学习关于 Golang 的“A Tour of GO”教程和以下代码:package mainimport ( "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) } // can't use v here, though return lim}func main() { fmt.Println( pow(3, 2, 10), pow(3, 3, 20), )}将打印“27 >= 20 9 20”。我很困惑为什么它不是“9 27 >= 20 20”第一次调用 pow(3,2,10) 不应该返回 9,打印它,然后调用 pow(3,3,20) 并打印其余的吗?
2 回答
繁花如伊
TA贡献2012条经验 获得超12个赞
这实际上有点微妙,让我困惑了一秒钟。“秘密”是一个函数必须在调用它之前评估它的所有参数。所以它调用函数两次以获得 9 和 20,但其中一个评估恰好调用 Println。
为什么语言在调用函数之前评估其参数是相当简单的(当涉及副作用时,这种部分应用程序很棘手,并且主要保留给函数式语言),但是隐藏具有副作用的函数,例如在函数评估中打印应该可能只是为了清楚起见而气馁。
代码可能更直接:
func main() {
arg1,arg2 := pow(3,2,10),pow(3,3,20)
fmt.Println(arg1, arg2)
}
慕标5832272
TA贡献1966条经验 获得超4个赞
fmt.Println() 在调用之前需要它的所有参数。
所以,您有 9,但是当您获得另一个值 (20) 时,控制台会打印其他内容。
是否就像这样:
package main
import "fmt"
func main() {
fmt.Println(9, f())
}
func f() int {
fmt.Println("This gets printed before")
return 20
}
输出:
This gets printed before
9 20
- 2 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消