go语言中的defer
扫描二维码
随时随地手机看文章
在Go语言中,defer语句用于在函数返回之前执行一段代码,通常用于资源清理或错误处理。你提供的代码片段是一个defer函数defer语句可以出现在函数的任何地方,但通常放在函数的开头,以确保资源清理或错误处理的逻辑不会被遗漏。
1.defer 的特点
延迟执行:defer语句中的函数调用将在当前函数返回之前执行。后进先出:如果有多个defer语句,它们将按照后进先出(LIFO)的顺序执行。
错误处理:defer语句可以捕获并处理函数返回时的错误。
资源清理:defer语句常用于关闭文件、释放锁、关闭网络连接等资源清理操作。
defer func() { ... }():
- 确保在函数返回时执行清理操作。
- 刷新缓冲区并关闭连接,即使发生错误也不会影响程序的逻辑。
- 忽略Flush方法的返回值,因为即使刷新失败也不会影响后续操作。
- 如果存在错误,关闭连接以释放资源。
- 忽略Close方法的返回值,因为即使关闭失败也不会影响程序的逻辑。
defer func() {
_ = c.buf.Flush()
if err != nil {
_ = c.Close()
}
}()
2.作用
是确保在函数返回时:
- 刷新缓冲区,将所有未写入的数据写入底层的io.Writer。
- 如果存在错误,关闭连接以释放资源。
3.defer的原理
`defer` 是 Go 语言中用于延迟执行函数的机制,其原理依赖于 Go 的运行时系统。每次遇到 `defer` 语句时,编译器会将其转换为对 `runtime.deferproc` 的调用,该函数创建一个 `_defer` 结构体对象并将其链接到当前 goroutine 的 `_defer` 链表中。`_defer` 结构体包含关键字段:`siz`(参数和结果大小)、`sp` 和 `pc`(栈指针和程序计数器)、`fn`(延迟函数指针)和 `link`(指向下一个 `_defer` 对象)。当函数返回时,`runtime.deferreturn` 按后进先出顺序执行延迟函数并返回。
4.defer 在资源清理中的应用
defer 常用于关闭文件、释放锁、关闭网络连接等资源清理操作,确保资源在函数退出时被正确释放。
func readFile(filename string) error {
file, err := os.Open(filename) if err != nil { return err
} defer file.Close() // 读取文件内容 return nil }