Go语言编程思想3——错误处理和资源管理
点击阅读更多查看文章内容
Go语言编程思想3——错误处理和资源管理
资源管理:及时关闭文件,及时释放资源,如果打开的文件还未关闭就因为出错而在中间跳出,就无法保证有效的资源管理,因此在这里两者一起进行考虑
一、defer调用
- 调用在函数结束时发生(在return/panic之前执行)
- 参数在defer语句时计算
- defer列表为先进后出(先defer的后执行)
1
2
3
4
5
6
7
8
9
10func tryDefer() {
for i := 0; i < 100; i++ {
defer fmt.Print(i," ")
if i == 30 {
panic("printed too many")
}
}
}
//执行结果:30 29 28 27 26 25 ... 3 2 1 0
//退出的时候i是30,但不会全部输出30, i是在执行defer语句时的值
Ex. 将前20个斐波那契数列输出到文件
1 | func writeFile(filename string) { |
何时使用defer调用
- Open/Close
- Lock/Unlock
- PrintHeader/PrintFooter
二、错误处理
- 尽量用error不用panic
- 意料之中的:使用error。如:文件打不开
- 意料之外的:使用panic。如:数组越界,如开了大小为n的数组,明明循环最大到n,但是结果越界,出现了意料之外的错误,这时用panic
error的定义
1 | type error interface { |
将error当做普通的值类型来处理即可
panic会把程序挂掉,尽量少用panic,遇到错误时可以输出提示语句后return
1 | func writeFile(filename string) { |
自建error
1 | err=errors.New("this is a custom error") |
服务器统一错误处理
1 | package filelisting |
1 | package main |
Go语言编程思想3——错误处理和资源管理