📚 全文字数 : 3k
⏳ 阅读时长 : 5min
📢 关键词 : defer、资源释放、底层实现
1:defer是什么
defer是Go语言的关键字,一般用于资源的释放和异常的捕捉(比如:文件打开、加锁、数据库连接、异常捕获),defer语句后将其后面跟随的语句进行延迟处理,就是说在函数执行完毕后再执行调用,也就是return的ret指令之前。
1.1 资源释放
资源的释放在代码中有很多场景,比如打开文件描述符资源后,需要进行file.close得到释放,在打开文件后就加上defer,避免在后续因为err导致的return退出忘记释放,文件资源。
func openFile() {
file, err := os.Open("txt")
if err != nil {
return
}
defer file.Close() //合理位置
}
常见的加锁场景,业务代码中忘记释放锁,那么会导致资源得不到释放,造成死锁,但是defer就很好解决了这个问题,不管业务逻辑怎么处理,最终还是会释放锁。
func lockScene() {
var mutex sync.Mutex
mutex.Lock()
defer mutex.Unlock()
//业务代码...
}
1.2 捕获异常
Go 语言中 recover 关键字主要用于捕获异常,让程序回到正常状态。recover 可以中止 panic