有没有办法操纵延迟堆栈?

lei*_*paC 1 go

有没有办法改变延迟堆栈?例如,在延迟堆栈的底部添加一个调用,或者删除最后放置的延迟?

Fli*_*mzy 7

defer堆栈唯一可能的修改是“弹出”到它上面。

话虽如此,您可以使用变量使 defer 可选,以便提前退出​​ deferred 函数。例子:

func foo() {
    var skipDefer bool
    defer func() {
        if skipDefer {
            return
        }
        // Do body of defer
    }()
    // Do stuff
    if someConditionIsTrue {
        skipDefer = true
    }
    defer func() {
        // Do this one unconditionally
    }
    // Do other stuff
}
Run Code Online (Sandbox Code Playgroud)

如果您真的想要,您还可以管理要手动执行的功能列表:

func foo() {
    var deferreds []func()
    defer func() {
        for _, f := range deferreds {
            f()
        }
    }()
    // Add to and arrange `deferreds` to your heart's content

}
Run Code Online (Sandbox Code Playgroud)