2 回答

TA貢獻1836條經(jīng)驗 獲得超5個贊
所以我在校對我的帖子時回答了我自己的問題。與其刪除它以掩飾我的尷尬,不如將其保留,以防其他人遭受同樣的困惑。
deferred 函數(shù)在調(diào)用時計算該函數(shù)的任何 ARGUMENTS。它不會立即評估函數(shù)體內(nèi)的任何值。因此,在延遲操作發(fā)生時執(zhí)行內(nèi)部分配。
所以:
代碼運行
遇到 defer 語句
golang 存儲參數(shù)值以備后用
延遲函數(shù)的主體被完全忽略
其余代碼運行到封閉函數(shù)的末尾
使用存儲的參數(shù)值執(zhí)行延遲函數(shù)
-麥克風

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
- 2 回答
- 0 關(guān)注
- 204 瀏覽
添加回答
舉報