为了解决函数突然异常退出, 导致某些资源未被释放, Go引入了defer
    defer后面的语句 会被推迟到函数返回后执行

    1. func CopyFile(dst, src string) (w int64, err error) {
    2. srcFile, err := os.Open(src)
    3. if err != nil { return }
    4. defer srcFile.Close()
    5. dstFile, err := os.Create(dstName)
    6. if err != nil { return }
    7. defer dstFile.Close()
    8. return io.Copy(dstFile, srcFile)
    9. }

    如果觉得一句话干不完清理的工作,也可以使用在 defer 后加一个匿名函数的做法:

    1. defer func() {
    2. // 做你复杂的清理工作
    3. } ()

    一个函数中可以存在多个 defer 语句,因此需要注意的是,
    defer 语句的调用是遵照 先进后出的原则,即最后一个 defer 语句将最先被执行