空指针解析,越界,除数为零等异常应该在检查 error 之后定义 defer。
专栏的介绍可以参考 《GotchaGolang专栏》,代码可以看《宝库-Gotcha》。
defer 定义的时机。
案例
一般应该把 defer 语句写在 erorr 检查之后:
1 | file, err := os.Open(dataFile) |
不要写成这样:
1 | file, err := os.Open(dataFile) |
因为 Close 并不检查 file 是否真的打开了。
总结
defer语句可以看成是把指定的函数压入“堆栈”,当外面函数退出时。“堆栈”内的函数会依次弹出执行。这样可以防止资源泄露。即使发生 panic 也会调用 defer 定义的内容,然后才运行 panic,依次上报 panic。
Merlin 2018.3 defer 定义时机的坑