为了解决函数突然异常退出, 导致某些资源未被释放, Go引入了defer
defer后面的语句 会被推迟到函数返回后执行
func CopyFile(dst, src string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil { return }
defer srcFile.Close()
dstFile, err := os.Create(dstName)
if err != nil { return }
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
如果觉得一句话干不完清理的工作,也可以使用在 defer 后加一个匿名函数的做法:
defer func() {
// 做你复杂的清理工作
} ()
一个函数中可以存在多个 defer 语句,因此需要注意的是,
defer 语句的调用是遵照
先进后出的原则,即最后一个 defer 语句将最先被执行