Go語言中的recover()函數(shù)用法解讀
recover() 是 Go 語言中用于處理 panic 的內(nèi)置函數(shù),它允許程序管理發(fā)生 panic 的 goroutine 的行為。
下面我將詳細解釋它的工作原理和使用方法。
基本概念
1. 函數(shù)簽名
func recover() any
2. 核心功能
recover() 可以:
- 停止 panic 的傳播
- 返回傳遞給
panic()的值 - 恢復正常的程序執(zhí)行
工作原理
1. 使用位置
recover() 必須在 defer 函數(shù)中直接調(diào)用才有效:
defer func() {
if r := recover(); r != nil {
// 處理 panic
}
}()
2. 返回值
- 當 goroutine 正在 panic 且在 defer 函數(shù)中調(diào)用時:返回傳遞給
panic()的值 - 其他情況(包括 panic 參數(shù)為 nil 的情況,Go 1.21 之前):返回 nil
使用示例
基本用法
func mayPanic() {
panic("something went wrong")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
mayPanic()
fmt.Println("This will not be executed if panic occurs")
}
輸出:Recovered from panic: something went wrong
實際應用場景
func safeDivide(a, b int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("runtime error: %v", r)
}
}()
return a / b, nil
}
重要特性
必須與 defer 配合使用:只有在 defer 函數(shù)中直接調(diào)用才有效
作用域限制:只能恢復同一個 goroutine 中的 panic
Go 1.21 的變化:
- 之前版本:
panic(nil)時recover()返回 nil - Go 1.21+:
panic(nil)會引發(fā) runtime panic,recover()返回*runtime.PanicNilError
注意事項
- 不要濫用 recover:應該只用于處理真正的意外情況,而不是替代常規(guī)錯誤處理
- 資源清理:即使 panic 被 recover,defer 函數(shù)仍然會執(zhí)行
- 跨 goroutine:無法恢復其他 goroutine 的 panic
- 性能影響:panic/recover 比常規(guī)錯誤處理機制性能差
與 panic 的關(guān)系
recover() 和 panic() 是配套使用的:
func doSomething() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
if somethingWrong {
panic("critical error")
}
}
最佳實踐
- 為關(guān)鍵代碼段添加 recover
- 記錄 recover 到的錯誤信息
- 盡量讓程序在 recover 后能繼續(xù)正常運行
- 避免在庫函數(shù)中靜默地 recover 而不返回錯誤
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù)
這篇文章主要為大家介紹了go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Golang實現(xiàn)的聊天程序服務端和客戶端代碼分享
這篇文章主要介紹了Golang實現(xiàn)的聊天程序服務端和客戶端代碼分享,本文先是講解了實現(xiàn)邏輯,然后給出了實現(xiàn)代碼,需要的朋友可以參考下2014-10-10
Go Mongox輕松實現(xiàn)MongoDB的時間字段自動填充
這篇文章主要為大家詳細介紹了Go語言如何使用 mongox 庫,在插入和更新數(shù)據(jù)時自動填充時間字段,從而提升開發(fā)效率并減少重復代碼,需要的可以參考下2025-02-02
Go在GoLand中引用github.com中的第三方包具體步驟
這篇文章主要給大家介紹了關(guān)于Go在GoLand中引用github.com中第三方包的具體步驟,文中通過圖文介紹的非常詳細,對大家學習或者使用Go具有一定的參考價值,需要的朋友可以參考下2024-01-01
VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題)
這篇文章主要介紹了VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04

