为了账号安全,请及时绑定邮箱和手机立即绑定

defer 和 println 参考问题?

defer 和 println 参考问题?

Go
慕斯709654 2022-11-15 09:42:05
我想知道为什么有 0 而不是 1?那是一个指针而不是一个值。谢谢大家。package mainimport "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
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

我希望这个简单明了的示例将有助于理解文档中的内容。


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


查看完整回答
反对 回复 2022-11-15
?
largeQ

TA贡献2039条经验 获得超8个赞

延迟调用的参数会立即求值,但直到周围函数返回时才会执行函数调用。

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


查看完整回答
反对 回复 2022-11-15
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号