前言
在极客上看了蔡超老师的Go语言课程 随手记下来的一些随笔,Go的基础应用及实例,
系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。目录如下
Go语言基础学习 (一) – 变量 常量已经与其他语言的差异
Go语言基础学习 (二) -Go语言中的类型转与Go语言中的数组切片
Go语言基础学习 (三) – Go语言内的 Map声明使用与工厂模式
Go语言基础学习 (四) – Go语言函数简单介绍
Go语言基础学习 (五) – 面向对象编程
Go语言基础学习 (六) – 编写一个好的错误处理
Go语言基础学习 (七) – 包(package)
Go语言基础学习 (八) – 并发编程
1. Go的错误机制与简单实例
-
以Fibonacci数列做一个error提示
var NumberTwoError = errors.New("参数不能小于2") var NumberError = errors.New("参数不能大于100") func GetFibonacci(n int) ([]int, error) { if n > 100{ return nil,NumberTwoError } if n < 2 { return nil,NumberTwoError } fibList := []int{1,1} for i :=2; i<n ;i++ { fibList = append(fibList,fibList[i-2]+fibList[i-1]) } return fibList,nil } func TestGetFibonacci(t *testing.T) { // 此处if判断类处理错误信息 if v,error := GetFibonacci(1); error!=nil{ if error == NumberTwoError { t.Log(error) } if error == NumberError{ t.Log(error) } }else { t.Log("运行正常",v) } } 复制代码
=== RUN TestGetFibonacci error_test.go:32: 参数不能小于2 --- PASS: TestGetFibonacci (0.00s) 复制代码
-
2.panic 与recover
panic:用于发送不可恢复的错误,执行defer func内的代码块,并请求退出程序。
recover:用于恢复panic抛出的错误。
os.Exit:用于直接退出程序。
代码实例
func TestPanicRecover(t *testing.T) { defer func() { fmt.Println("错误信息:",err) }() fmt.Println("Start") panic(errors.New("Something wrong!")) } 复制代码
Start 错误信息: Something wrong! 复制代码
与php内的try方法类似,正常执行程序,panic定义错误,再到defer处抛出错误
panic与os.Exit对比下的区别
1.
os.Exit退出程序时不会先调用defer func代码块。
2.os.Exit退出程序时不会输出当前调用栈信息。
那么,如果我们就是想让程序不
crash,
有没有办法呢?答案是有的,使用
recover
,但是很不推荐这么使用recover
。panic
的问题,只是把错误移除,这样是很不安全的。 甚至,如果是因为系统资源panic
,这样我们的服务就变成了僵尸服务,虽然活着但无法提供服务功能。recover
使用方式如下,但一般不推荐使用。func TestPanicRecover(t *testing.T) { defer func() { if err := recover(); err != nil { // 恢复错误 fmt.Println("recover panic", err) } }() fmt.Println("Test panic is Started.") panic(errors.New("Something wrong!")) } 复制代码
因此,小心使用
recover!
可能会导致
1.形成僵尸服务进程,使安全检查
health check
失效
2. 因为没有crash
,导致提供不确定的服务。
因此,需要谨慎使用recover
。