为了解决函数突然异常退出, 导致某些资源未被释放, 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 语句将最先被执行
