Golang: defer 时机问题(6)

空指针解析,越界,除数为零等异常应该在检查 error 之后定义 defer。

专栏的介绍可以参考 《GotchaGolang专栏》,代码可以看《宝库-Gotcha》

defer 定义的时机。

案例

一般应该把 defer 语句写在 erorr 检查之后:

1
2
3
4
5
file, err := os.Open(dataFile)
if err != nil {
...
}
defer file.Close()

不要写成这样:

1
2
3
4
5
file, err := os.Open(dataFile)
defer file.Close()
if err != nil {
...
}

因为 Close 并不检查 file 是否真的打开了。

总结

defer语句可以看成是把指定的函数压入“堆栈”,当外面函数退出时。“堆栈”内的函数会依次弹出执行。这样可以防止资源泄露。即使发生 panic 也会调用 defer 定义的内容,然后才运行 panic,依次上报 panic。


Merlin 2018.3 defer 定义时机的坑

文章目录
  1. 1. 案例
  2. 2. 总结
|