为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号