defer执行顺序为后进先出,常用于资源释放和错误处理;通过命名返回值,defer可修改返回错误,如文件关闭或数据库事务回滚时确保清理操作执行。

在Go语言中,defer 是一个非常有用的关键字,用于延迟函数调用的执行,直到外围函数即将返回时才执行。它常被用于资源释放、锁的释放或错误处理等场景。理解 defer 的执行顺序 以及它在 错误处理中的作用,对编写健壮的Go代码至关重要。
多个 defer 语句的执行顺序是后进先出(LIFO),即最后声明的 defer 最先执行。
例如:
func example() {
defer fmt.Println("First")
defer fmt.Println("Second")
defer fmt.Println("Third")
}
输出结果为:
立即学习“go语言免费学习笔记(深入)”;
Third Second First
这个特性非常适合成对操作,比如打开和关闭文件、加锁和解锁。
defer 常用于确保资源被正确释放,即使发生错误。结合命名返回值,defer 还可以修改返回的错误。
常见用法示例:文件操作
func readFile(filename string) (err error) {
file, err := os.Open(filename)
if err != nil {
return err
}
defer func() {
if closeErr := file.Close(); closeErr != nil {
err = closeErr // 覆盖返回的错误
}
}()
// 模拟读取文件内容
data := make([]byte, 100)
_, err = file.Read(data)
return err // 如果 Close 出错,会覆盖此处的 err
}
在这个例子中:
在事务处理中,如果发生错误需要回滚,defer 可以确保无论函数从哪个路径返回,都能正确清理。
func updateUser(tx *sql.Tx) (err error) {
defer func() {
if err != nil {
tx.Rollback() // 出错则回滚
}
}()
_, err = tx.Exec("UPDATE users SET name = ? WHERE id = 1", "Alice")
if err != nil {
return err // defer 会检测到 err 不为 nil 并触发 Rollback
}
err = tx.Commit() // 提交事务
return err
}
这里利用了 defer 对命名返回值 err 的访问能力,在函数结尾判断 err 是否为 nil 来决定是否回滚。
基本上就这些。defer 不仅简化了资源管理,还能在错误处理中发挥关键作用,只要注意执行顺序和命名返回值的使用即可。不复杂但容易忽略。
以上就是Golangdefer顺序执行与错误处理案例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号