1.os.Exit()
Exit 导致当前程序以给定的状态代码退出。通常,代码零表示成功,非零表示错误。
程序立即终止,defer函数不会运行。
为了可移植性,状态码应该在 [0, 125] 范围内。
package main
import "os"
func main() {
os.Exit(1)
}
//结果:
进程 已完成,退出代码为 1
package main
import "os"
func main() {
os.Exit(0)
}
//结果:
进程 已完成,退出代码为 0
2.log.Fatal()
package main
import "log"
func main() {
log.Println("1")
defer func() {
log.Println("2")
}()
log.Fatal("3")
log.Println("4")
}
//结果:
2021/12/05 17:50:19 1
2021/12/05 17:50:19 3
进程 已完成,退出代码为 1
可见log.Fatal()会直接退出,但是会打印里面的内容,之前的 defer 函数不会运行
log.Fatal()的源码
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
std.Output(2, fmt.Sprint(v...))
os.Exit(1)
}
3.panic()
panic 内置函数停止当前 goroutine 的正常执行。当函数 F 调用 panic 时,F 的正常执行会立即停止。任何被 F 推迟执行的函数都以通常的方式运行,然后 F 返回给它的调用者。对于调用者 G,F 的调用就像调用 panic,终止 G 的执行并运行任何延迟函数。这一直持续到正在执行的 goroutine 中的所有函数都以相反的顺序停止。此时,程序以非零退出代码终止。这种终止序列称为恐慌,可以由内置函数 recover 控制。
package main
import "log"
func main() {
log.Println("1")
defer func() {
log.Println("2")
}()
defer func() {
log.Println("3")
}()
defer func() {
log.Println("4")
}()
panic("5")
log.Println("6")
}
//结果:
2021/12/05 17:57:51 1
2021/12/05 17:57:51 4
2021/12/05 17:57:51 3
2021/12/05 17:57:51 2
panic: 5
goroutine 1 [running]:
main.main()
/Users/haha/kevin_go/src/go_learning/test.go:16 +0xa8
进程 已完成,退出代码为 2
可见,panic虽然会停止函数的执行,但是之前的 defer 函数可以正常运行,同时panic也会打印出里面的内容。