前言
golang中的defer关键字可以帮我们干很多脏活累活,合理的使用它能让我们的代码更稳而且也更可读,同时也提高了代码的可读性,以下是在日常golang编码中的一些常见的使用场景:
使用场景
资源管理or释放
读取文件、建立网络连接、数据库连接等操作之后,为了防止资源的浪费需要及时的对这些资源进行释放:
func readFile(filename string) ([]byte, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close() // 在函数返回前关闭文件
// 读取文件内容
data, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
return data, nil
}
释放锁
go并发编程场景会比较多,多协程之间使用互斥锁的情况比较多,因此需要合理的对锁进行释放:
var mu sync.Mutex
func safeIncrement() {
mu.Lock()
defer mu.Unlock() // 确保互斥锁被正确释放
// 修改共享变量
}
panic处理
程序中可能会存在一些逻辑会panic而导致整个程序崩溃而退出,这时候就需要使用defer进行一些处理保证程序不会退出:
func doSomething() {
defer func() {
if r := recover(); r != nil {
// 恢复程序状态或执行清理操作
}
}()
// 可能会触发 panic 的逻辑
}
错误处理
为了实现代码错误的合理处理,避免重复代码,可以使用defer进行错误处理:
func doSomething() error {
file, err := os.Open("filename")
if err != nil {
return err
}
defer file.Close() // 确保文件被关闭
// 文件操作
return nil
}
以上便是对defer的一些使用总结,欢迎大家提出问题和指正。