假设我有这个功能:
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
将永远返回零。所以我不确定你要做什么。如果你要做的是将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
}
这会被视为尾递归调用吗?
没有。
可以通过编译器优化尾递归调用吗?
没有。
不要那样做。这种聪明才智。