我有這個代碼:defer common.LogWarning( "b09ee123-f18b-46a8-b80d-f8361771178d:", resp.Body.Close(), // gets called immediately, is *not* deferred..)而 common.LogWarning 就是這樣:func LogWarning(uuid string, err error) { if err != nil { log.Warning(uuid, err) }}問題是它resp.Body.Close()會立即被調用 - 該調用不會被延遲,那么它是如何工作的呢?為什么不延遲整個代碼塊?
3 回答

炎炎設計
TA貢獻1808條經驗 獲得超4個贊
該defer語句延遲函數調用。立即評估函數的參數。
使用匿名函數來實現您的目標:
defer func() {
common.LogWarning("b09ee123-f18b-46a8-b80d-f8361771178d:",
resp.Body.Close())
}()
由尾隨代表的調用()被延遲。

開滿天機
TA貢獻1786條經驗 獲得超13個贊
defer將函數的執行推遲到當前函數返回。立即評估函數的參數。
https://tour.golang.org/flowcontrol/12
如果您需要延遲所有評估都將被延遲的代碼塊,請將其設為函數:
defer func() {
// Stuff to defer here
}()
``
- 3 回答
- 0 關注
- 116 瀏覽
添加回答
舉報
0/150
提交
取消