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

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

Golang 中的 defer 關鍵字實際上是如何工作的

Golang 中的 defer 關鍵字實際上是如何工作的

Go
冉冉說 2022-06-13 10:22:23
我有這個代碼: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())

}()

由尾隨代表的調用()被延遲。


查看完整回答
反對 回復 2022-06-13
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

defer將函數的執行推遲到當前函數返回。立即評估函數的參數。


https://tour.golang.org/flowcontrol/12


如果您需要延遲所有評估都將被延遲的代碼塊,請將其設為函數:


defer func() {

  // Stuff to defer here

}()

``


查看完整回答
反對 回復 2022-06-13
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

文檔中:

defer 語句的行為是直接且可預測的。有三個簡單的規則:

  1. 評估 defer 語句時評估延遲函數的參數。


查看完整回答
反對 回復 2022-06-13
  • 3 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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