到目前为止,Go编程语言是否优化尾调用?如果没有,它是否至少优化了函数的尾递归调用?
我认为一个等效的问题是-是否所有运行时错误都可能致命,恐慌?因为任何恐慌都应该可以恢复。我不是在谈论从诸如os.Exit(),或log.Fatal(),Go运行时中的错误或某人通过电源线跳闸中恢复,而是从其他运行时错误中恢复,这将导致程序崩溃。
这是可以通过紧急/恢复捕获的运行时错误的示例:
package main
import (
"fmt"
)
func errorHandler() {
r := recover()
err := r.(error)
if err == nil {
return
}
fmt.Println(err.Error())
}
func foo() {
defer errorHandler()
smallSlice := []int{1, 0, 1}
smallSlice[10] = 1
}
func main() {
foo()
fmt.Println("recovery, end of main")
}
Run Code Online (Sandbox Code Playgroud)
输出:
运行时错误:索引超出范围
恢复,主程序结束
是否有一些示例,其中运行时错误将使程序崩溃而没有可恢复的恐慌?