前言:
本专题用于记录本身(647)在Go语言方向的学习和积累。 系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。
目录以下:
Go语言基础(一)—— 简介、环境配置、HelloWorld
Go语言基础(二)—— 基本经常使用语法
Go语言基础(三)—— 面向对象编程
Go语言基础(四)—— 优质的容错处理
Go语言基础(五)—— 并发编程
Go语言基础(六)—— 测试、反射、Unsafe
Go语言基础(七)—— 架构 & 常见任务
Go语言基础(八)—— 性能调优编程
引子:
Go语言自己没有try/catch
异常机制,由于Go的三位创始人在设计Go语言之出以为这样写会变得很繁琐。
但由于:Go自己支持函数多返回值,所以在写函数的时候,能够优先考虑容错处理。安全
接下来,咱们来看看在Go语言中如何作容错处理。架构
首先,咱们要知道:Go语言中没有try/catch
异常机制。并发
其次,要实现容错处理:使用error类型便可,默认实现error接口。app
type error interface {
Error() string
}
复制代码
var xxxError = errors.New("xxxxx") // 快速建立错误类型
复制代码
接下来举一个例子:
咱们把以前写的Fibonacci的例子加上容错处理,就变成了下面这样。less
函数添加了多返回值,最后一个返回error。
若error有值,说明有异常;
若error无值,说明程序正常。函数
var LessThanTwoError = errors.New("n shoule not less than 2") // 定义错误类型
func GetFibonacci(n int) ([]int, error) {
// 容错处理
if n <= 2 {
return nil, LessThanTwoError
}
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 value, err := GetFibonacci(0); err != nil {
if err == LessThanTwoError {
fmt.Println("It is less error.")
}
t.Error(err)
} else {
t.Log(value)
}
}
复制代码
defer func
内的代码块,并请求退出程序。panic
抛出的错误。咱们举个简单的例子:性能
func TestPanic(t *testing.T) {
defer func() {
fmt.Println("Finally!")
}()
fmt.Println("Test panic is Started.")
panic(errors.New("Something wrong!"))
}
复制代码
其实,os.Exit
也能够退出程序。学习
func TestOsExit(t *testing.T) {
fmt.Println("Test os.Exit is Started.")
os.Exit(0)
}
复制代码
问:
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
! 可能会致使:
health check
失效。crash
,致使提供不肯定的服务。所以,须要谨慎使用recover
。
PS:另附上,分享连接:《Go语言从入门到实战》 祝你们学有所成,工做顺利。谢谢!