defer用于延迟执行函数,确保资源如文件、网络连接等被安全释放,遵循后进先出原则,在函数退出前自动调用,提升程序健壮性。

在Golang中,defer 是一个非常实用的关键字,用于延迟执行函数或方法调用,常用于资源的清理工作,比如关闭文件、释放锁或关闭网络连接。合理使用 defer 能有效避免资源泄漏,提升程序的健壮性和可读性。
defer 语句会将其后的函数调用压入一个栈中,当包含 defer 的函数执行完毕前(无论是正常返回还是发生 panic),这些被延迟的函数会按照“后进先出”的顺序执行。
这个特性非常适合用于资源释放场景,确保打开的资源一定会被关闭。
在操作文件时,打开后必须确保调用 Close() 方法释放系统资源。使用 defer 可以简化这一流程。
立即学习“go语言免费学习笔记(深入)”;
示例代码:
file, err := os.Open("example.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close() // 确保函数退出前关闭文件
// 读取文件内容
data := make([]byte, 100)
_, err = file.Read(data)
if err != nil && err != io.EOF {
log.Fatal(err)
}
// 不需要手动调用 Close,defer 会处理
注意:应确保在 err 判断通过后再调用 defer,避免对 nil 文件句柄调用 Close。
在网络编程中,如使用 net.Conn 或 http.Response.Body,也需要及时关闭连接以避免连接泄漏。
常见场景如下:
resp, err := http.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close() // 防止响应体未关闭导致内存泄漏
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
defer conn.Close() // 确保连接关闭
_, err = conn.Write([]byte("ping"))
if err != nil {
log.Fatal(err)
}
虽然 defer 使用方便,但也有一些需要注意的地方:
defer fmt.Println(i)
基本上就这些。合理使用 defer 让资源管理更安全、代码更清晰。只要记得在获得资源后立即 defer 关闭,就能避免大多数泄漏问题。
以上就是Golang使用defer安全关闭文件和网络连接的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号