首页 > 解决方案 > 有没有办法操纵延迟堆栈?

问题描述

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

标签: go

解决方案


对堆栈唯一可能的修改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
}

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

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

}

推荐阅读