defer 和 println 参考问题?

Defer and println reference issues?

我想知道为什么是0而不是1?

那是一个指针,不是 value.thanks 伙计们。

package main

import "fmt"

func main() {
    var i = new(int)
    defer func(i *int) {
        fmt.Printf("3:%p,%v\n", i, *i)
    }(i)
    defer fmt.Printf("2:%p,%v\n", i, *i)
    *i++
    fmt.Printf("1:%p,%v\n", i, *i)
}

//1:0x1400001c0a0,1
//2:0x1400001c0a0,0
//3:0x1400001c0a0,1

希望this simple and clear example有助于理解文档中的内容。

import "fmt"

func params() int {
    fmt.Println("params")
    return 0
}

func f(int) {
    fmt.Println("deferred")
}

func main() {
    defer f(params())
    fmt.Println("exit")
}

结果

params
exit
deferred

立即评估延迟调用的参数,但直到周围函数 returns.

才执行函数调用

在第一个 defer 中,您使用调用 func 时收到的参数 i。 在第二个 defer fmt.Printf("2:%p,%v\n", i, *i) 中,I 的值在 *i++

之前就已经求值了