亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 90 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號