defer 和 println 参考问题?

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


那是一个指针而不是一个值。谢谢大家。


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


慕斯709654
浏览 102回答 2
2回答

繁星点点滴滴

我希望这个简单明了的示例将有助于理解文档中的内容。import "fmt"func params() int {    fmt.Println("params")    return 0}func f(int) {    fmt.Println("deferred")}func main() {    defer f(params())    fmt.Println("exit")}和结果paramsexitdeferred

largeQ

延迟调用的参数会立即求值,但直到周围函数返回时才会执行函数调用。在第一个 defer 中,您使用调用 func 时收到的参数 i。在第二个 defer fmt.Printf("2:%p,%v\n", i, *i) 中,I 的值在 *i++ 之前就已经求值了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go