编译器可以优化 defer 中的递归调用吗?

Can a recursive call in defer be optimized by the compiler?

假设我有这个功能:

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() 函数,它是安全的并且正确地确定何时退出。

Will this be considered as a tail-recursive call?

没有。

Can it be optimized by the compiler as tail-recusrsive calls may be optimized?

没有

不要那样做。这么聪明是不行的。

这里有两点要说:

  • recover() 将获取传递给 panic 的值。在您的情况下,除非 someCondition 出现恐慌,否则 recover 将始终 return 为零。所以我不确定你想做什么。
  • 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
}