第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

golang defer 未按預期進行評估

golang defer 未按預期進行評估

Go
qq_遁去的一_1 2021-09-13 16:22:16
因此,根據(jù)規(guī)范,在調(diào)用 defer 函數(shù)時會評估 defer 函數(shù)中的值,但在封閉函數(shù)返回之前不會執(zhí)行操作。我明白了,并理解了整個 'for i:=0;i<4;i++ defer example prints 3210' 的事情。但是,當我嘗試使用 defer 臨時分配覆蓋值(將 max m 分配給隊列長度 q)時,請確保在完成后重置該值(示例簡化為演示):type tss struct {    q int    m int}func (t *tss) test() {    if true {        defer func() {            t.q=t.q     //this should evaluate to 't.q = 50' right?            fmt.Println("assigned",t.q,"to t.q")        }()        t.q = t.m    }    fmt.Printf("q=%v, m=%v\n", t.q, t.m)}func main() {    ts := tss{50,1}    fmt.Printf("q=%v, m=%v\n", ts.q, ts.m)    ts.test()    fmt.Printf("q=%v, m=%v\n", ts.q, ts.m)}我希望收到輸出:q=50, m=1q=1, m=1assigned 50 to t.qq=50, m=1但實際輸出是:q=50, m=1q=1, m=1assigned 1 to t.qq=1, m=1因此,這些值似乎是在錯誤的時間進行評估的。但是,當我首先將 tq 轉(zhuǎn)儲到變量中并將該賦值移到延遲函數(shù)之外,并將測試函數(shù)更改為如下所示:func (t *tss) test() {    if true {        qtmp := t.q        defer func() {            //assigning qtmp here still assigns 1 back to t.q            t.q=qtmp            fmt.Println("assigned",t.q,"to t.q")        }()        t.q = t.m    }    fmt.Printf("q=%v, m=%v\n", t.q, t.m)}我得到了上面的預期輸出,其中分配了 50。我是否遇到了錯誤,或者是否有關(guān)于在我缺少的延遲函數(shù)中分配值的問題?可能值得注意的是,如果我將 tq 作為函數(shù)參數(shù)傳入,它也能正常工作:func (t *tss) test() {    if true {        defer func(q int) {            t.q=q            fmt.Println("assigned",t.q,"to t.q")        }(t.q)        t.q = t.m    }    fmt.Printf("q=%v, m=%v\n", t.q, t.m)}
查看完整描述

2 回答

?
一只甜甜圈

TA貢獻1836條經(jīng)驗 獲得超5個贊

所以我在校對我的帖子時回答了我自己的問題。與其刪除它以掩飾我的尷尬,不如將其保留,以防其他人遭受同樣的困惑。

deferred 函數(shù)在調(diào)用時計算該函數(shù)的任何 ARGUMENTS。它不會立即評估函數(shù)體內(nèi)的任何值。因此,在延遲操作發(fā)生時執(zhí)行內(nèi)部分配。

所以:

  1. 代碼運行

  2. 遇到 defer 語句

  3. golang 存儲參數(shù)值以備后用

  4. 延遲函數(shù)的主體被完全忽略

  5. 其余代碼運行到封閉函數(shù)的末尾

  6. 使用存儲的參數(shù)值執(zhí)行延遲函數(shù)

-麥克風


查看完整回答
反對 回復 2021-09-13
?
青春有我

TA貢獻1784條經(jīng)驗 獲得超8個贊

很好地回答你自己的問題。我認為值得向未來的讀者展示對您最初嘗試的更正。


func (t *tss) test() {

    if true {

        defer func(q int) {

            t.q = q //this should evaluate to 't.q = 50' right?

            fmt.Println("assigned", t.q, "to t.q")

        }(t.q)

        t.q = t.m

    }

    fmt.Printf("q=%v, m=%v\n", t.q, t.m)

}

輸出


q=50, m=1

q=1, m=1

assigned 50 to t.q

q=50, m=1


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關(guān)注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號