Posts
defer用法
Revise in 2022-3-18 defer用法 defer用来延迟对某个语句的调用,常用于处理成对的操作,如打开、关闭、连接、断开连接,加锁、释放锁。通过defer语句,无论函数逻辑多复杂,都能保证在任何代码执行路径下,资源被释放。defer应该直接跟在请求资源的语句后。 defer语句将函数的调用push到一个列表中,当外层函数返回时,会执行保存的函数列表 举个例子,这个程序打开两个文件并将一个文件的内容复制到另一个文件的函数 func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } dst, err := os.Create(dstName) if err != nil { return } written, err = io.Copy(dst, src) dst.Close() src.Close() return } 这个函数似乎可以正常工作,但其实存在一个bug,如果对os.Create的调用失败,该函数将返回但却不关闭源文件,通过在第二个return语句中调用src.Close可以解决这个问题。但是如果函数更加复杂,问题可能不会那么容易被发现和解决。通过使用defer语句,可以确保始终关闭文件。 func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } defer src....