登录
首页 >  Golang >  Go问答

能否通过编译器来优化 defer 中的递归调用?

来源:stackoverflow

时间:2024-03-22 19:27:28 383浏览 收藏

在 Go 语言中,`defer` 中的递归调用无法被编译器优化为尾递归。Go 语言不支持尾递归优化,而是更注重生成有意义的堆栈跟踪。因此,即使`defer`中包含递归调用,编译器也不会进行优化,而会像普通函数调用一样执行。

问题内容

假设我有这个功能:

func abc(i int) (e error) {
    defer func() {
        if r := recover(); r != nil {
            abc(i * 2)
        }
    }()

    if someCondition(i) {
      return fmt.Errorf("Some Err");
    }

    return action() // returns err (nil in case of success) or panics
}

这会被视为尾递归调用吗?它可以被编译器优化吗,就像尾递归调用可以被优化一样?

我知道以这种方式抑制恐慌并不是一个好的决定,但假设有一个正确的 condition() 函数,该函数是安全的并且可以正确确定何时退出。


解决方案


这里有两件事要说:

  • recover() 将获取传递给 panic 的值。在您的情况下,除非 somecondition 出现恐慌,否则 recover 将始终返回 nil。所以我不确定你想做什么。
  • go 不进行尾部调用优化,go 团队更喜欢有意义的堆栈跟踪。对此进行了讨论,但尚未达成一致。

如果您想要做的是乘以 i * 2 直到条件为真,那么只需执行以下操作:

// using recursion
func abc(i int) error {
    if err := someCondition(i); err != nil {
      return abc(i * 2);
    }
    return nil
}

// using loop
func abc(i int) error {
    for someCondition(i) != nil {
        i *= 2
    }
    return nil
}

没有。

没有。

不要那样做。这样的聪明才智是不值得的。

好了,本文到此结束,带大家了解了《能否通过编译器来优化 defer 中的递归调用?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>