为了账号安全,请及时绑定邮箱和手机立即绑定

这个 Go 打印语句的顺序是什么?

这个 Go 打印语句的顺序是什么?

Go
手掌心 2021-11-08 15:52:51
我正在学习关于 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)

}


查看完整回答
反对 回复 2021-11-08
?
慕标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


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信