dragon012100
2018-05-13 16:53
浏览 47
已采纳

有没有办法在GO中操纵延迟堆栈?

Is there any way to change the defer stack? For example, adding a call to the bottom of the defer stack, or removing the last defer placed?

图片转代码服务由CSDN问答提供 功能建议

是否可以更改延迟堆栈? 例如,将调用添加到延迟堆栈的底部,还是删除最后放置的延迟?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • duancao2082 2018-05-13 17:08
    已采纳

    The only modification possible to the defer stack is to "pop" onto it.

    Having said that, you could make a defer optional with a variable to early-exit from the deferred function. Example:

    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
    }
    

    You could also manage a list of functions to be executed manually, if you really want to:

    func foo() {
        var deferreds []func()
        defer func() {
            for _, f := range deferreds {
                f()
            }
        }()
        // Add to and arrange `deferreds` to your heart's content
    
    }
    
    已采纳该答案
    打赏 评论
  • dongxi9326 2018-05-13 16:59

    The defer stack is a LIFO stack, so you can obviously influence the order in which deferred statements execute in the function body.

    However, your question seems to be about modifying the defer stack in ways other than simply changing the order in which things are added to it, which is a feature that is not presently supported by the Go runtime.

    打赏 评论

相关推荐 更多相似问题