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

我正在学习关于 Golang 的“A Tour of 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)

    }

    // 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) 并打印其余的吗?



手掌心
浏览 203回答 2
2回答

繁花如伊

这实际上有点微妙,让我困惑了一秒钟。“秘密”是一个函数必须在调用它之前评估它的所有参数。所以它调用函数两次以获得 9 和 20,但其中一个评估恰好调用 Println。为什么语言在调用函数之前评估其参数是相当简单的(当涉及副作用时,这种部分应用程序很棘手,并且主要保留给函数式语言),但是隐藏具有副作用的函数,例如在函数评估中打印应该可能只是为了清楚起见而气馁。代码可能更直接:func main() {&nbsp; &nbsp; arg1,arg2 := pow(3,2,10),pow(3,3,20)&nbsp; &nbsp; fmt.Println(arg1, arg2)}

慕标5832272

fmt.Println() 在调用之前需要它的所有参数。所以,您有 9,但是当您获得另一个值 (20) 时,控制台会打印其他内容。是否就像这样:package mainimport "fmt"func main() {&nbsp; &nbsp; fmt.Println(9, f())}func f() int {&nbsp; &nbsp; fmt.Println("This gets printed before")&nbsp; &nbsp; return 20}输出:This gets printed before9 20
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go