为什么从这个简单的Go代码中得到这样的输出?

时间:2019-01-26 21:32:30

标签: go

我是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发生的情况吗?

1 个答案:

答案 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的代码时,知道ij的值,对吗?然后,该呼叫将按预期返回5。为此,Go编译器安排add的参数-a()b()add本身运行之前运行。


使用Printlnpow的代码示例中也会发生同样的情况。 Println的参数需要在其主体运行之前进行评估,而评估pow会导致其他内容被打印。