编译器可以优化 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
}
假设我有这个功能:
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
}