前言
在极客上看了蔡超老师的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 与recoverpanic:用于发送不可恢复的错误,执行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。