宕机不是一件很好的事情,可能造成体验停止、服务中断,就像没有人希望在取钱时遇到 ATM 机蓝屏一样。但是,如果在损失发生时,程序没有因为宕机而停止,那么用户将会付出更大的代价,这种代价可以是金钱、时间甚至生命。因此,宕机有时是一种合理的止损方法。
手动触发宕机
Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失。
Go 语言程序在宕机时,会将堆栈和 goroutine 信息输出到控制台,所以宕机也可以方便地知晓发生错误的位置。如果在编译时加入的调试信息甚至连崩溃现场的变量值、运行状态都可以获取,那么如何触发宕机呢?例如下面的代码:
package main
func main() {
panic("crash")
}
代码运行崩溃并输出如下
panic: crash
goroutine 1 [running]:
main.main()
F:/src/tester/main.go:5 +0x6b
以上代码中只用了一个内建的函数 panic() 就可以造成崩溃,panic() 的声明如下:
func panic(v interface{})
panic() 的参数可以是任意类型,后文将提到的 recover 参数会接收从 panic() 中发出的内容。
在运行依赖的必备资源缺失时主动触发宕机
regexp 是 Go 语言的正则表达式包,正则表达式需要编译后才能使用,而且编译必须是成功的,表示正则表达式可用。