换行打印执行流程

Printing execution flow with new line

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),
    )
}

此代码来自"A Tour of GO"

期望:

9   
10   
27 >= 20     
20

输出:

27 >= 20    
9 20

我不明白这个。帮帮我!

Println 函数将在一行中输出两个 pow 函数,然后在从 Println 函数返回后添加 \n

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))
    fmt.Println(pow(3, 3, 20))
}

Playground

10 是 first if case 永远不会打印的限制。

9
10
27 >= 20
20

因为pow函数在函数之前返回

首先评估参数,pow 内的 Printlnif 块中,因此它有条件地运行。

首先,计算 main()Println 的参数。第一次调用 pow 导致 9 小于 lim,因此 pow 本身不打印任何内容并且 returns 9。第二次调用 pow 导致 27 大于 lim,因此 pow 打印 27 >= 20 和 returns 20。然后,在处理参数后,执行 main 中对 Println 的调用,打印 9 20.