Golang 中的 defer 关键字实际上是如何工作的

我有这个代码:


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()会立即被调用 - 该调用不会被延迟,那么它是如何工作的呢?为什么不延迟整个代码块?


冉冉说
浏览 168回答 3
3回答

炎炎设计

该defer语句延迟函数调用。立即评估函数的参数。使用匿名函数来实现您的目标:defer func() {    common.LogWarning("b09ee123-f18b-46a8-b80d-f8361771178d:",          resp.Body.Close())}()由尾随代表的调用()被延迟。

开满天机

defer将函数的执行推迟到当前函数返回。立即评估函数的参数。https://tour.golang.org/flowcontrol/12如果您需要延迟所有评估都将被延迟的代码块,请将其设为函数:defer func() {  // Stuff to defer here}()``

慕哥6287543

从文档中:defer 语句的行为是直接且可预测的。有三个简单的规则:评估 defer 语句时评估延迟函数的参数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go