一文詳解Golang中的errors包
errors.New
func New(text string) error
錯(cuò)誤處理是開發(fā)過程中必不可少的,使用 errors.New 函數(shù)可以創(chuàng)建一個(gè)表示特定錯(cuò)誤的對(duì)象。接受一個(gè)字符串類型的參數(shù)(用于描述錯(cuò)誤信息),返回一個(gè) error 類型的值。例如:
package main import "errors" func main() { err := errors.New("invalid input") }
error 類型是 builtin 包中定義的一個(gè)接口,定義如下:
type error interface { Error() string }
可以看出此接口定義了一個(gè)基本的 Error 方法,用于返回錯(cuò)誤的描述信息。
package main import ( "errors" "fmt" ) func main() { err := errors.New("invalid input") errDesc := err.Error() fmt.Println(errDesc) // 輸出 invalid input }
errors.Is
func Is(err, target error) bool
用于判斷給定的錯(cuò)誤是否是目標(biāo)錯(cuò)誤類型或者基于目標(biāo)錯(cuò)誤類型包裝過的錯(cuò)誤,會(huì)遞歸檢查錯(cuò)誤鏈,直到找到目標(biāo)錯(cuò)誤類型或者到達(dá)錯(cuò)誤鏈的末尾。如果找到目標(biāo)錯(cuò)誤類型,則返回true,否則返回false??磦€(gè)例子:
package main import ( "errors" "fmt" ) func main() { err := errors.New("invalid input") err1 := errors.New("invalid input") err2 := fmt.Errorf("err2: [%w]", err) fmt.Println(errors.Is(err1, err)) // false fmt.Println(errors.Is(err2, err)) // true }
因?yàn)?err 和 err1 都是使用 errors.New 函數(shù)創(chuàng)建的,所以使用 Is 判斷會(huì)返回 false。err2 是基于 err 包裝出來的,所以使用 Is 判斷會(huì)返回 true。
errors.AS
func As(err error, target any) bool
用于將錯(cuò)誤轉(zhuǎn)換為特定類型的錯(cuò)誤,As 函數(shù)會(huì)檢查 err 是否是 target 指向的類型的實(shí)例,如果是,將該實(shí)例賦值給 target 并返回 true。否則返回 false??磦€(gè)例子:
package main import ( "errors" "fmt" ) type MyError struct { Message string } func (e *MyError) Error() string { return e.Message } func main() { err := &MyError{ Message: "This is a custom error", } var target *MyError if errors.As(err, &target) { fmt.Println("Custom error found:", target.Message) } else { fmt.Println("Custom error not found") } }
使用 errors.As 來檢查 err 是否是 MyError 類型的實(shí)例,并將實(shí)例賦值給 target。運(yùn)行一下示例看下效果
$ go run main.go Custom error found: This is a custom error
這個(gè)功能通常用于處理不同類型的錯(cuò)誤,根據(jù)錯(cuò)誤的類型采取對(duì)應(yīng)的處理方式。
errors.Unwrap
func Unwrap(err error) error
用于將一個(gè)錯(cuò)誤對(duì)象展開,得到下一層錯(cuò)誤對(duì)象,如果錯(cuò)誤對(duì)象沒有下一層錯(cuò)誤對(duì)象,則返回 nil??磦€(gè)例子:
package main import ( "errors" "fmt" ) func main() { originalErr := errors.New("original error") err := fmt.Errorf("error: %w", originalErr) unwrappedErr := errors.Unwrap(err) fmt.Println(unwrappedErr) // 輸出: original error }
使用 fmt.Errorf 函數(shù)將 originalErr 做了一層包裝后得到 err,然后通過使用 Unwrap 將 err 解包并得包裝前的錯(cuò)誤對(duì)象 originalErr。需要注意的是 Unwrap 只能展開被 fmt.Errorf 包裝的錯(cuò)誤對(duì)象。如果想要展開其他類型的錯(cuò)誤對(duì)象,可以使用類型斷言操作符 `.` 進(jìn)行類型斷言。
小結(jié)
errors 包提供了一些簡(jiǎn)單易用的函數(shù)來處理和獲取錯(cuò)誤信息,借助 errors 包可以實(shí)現(xiàn)非常強(qiáng)大的錯(cuò)誤處理功能。
到此這篇關(guān)于一文詳解Golang中的errors包的文章就介紹到這了,更多相關(guān)Golang errors包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼
Go語言的標(biāo)準(zhǔn)庫math提供了一系列基礎(chǔ)數(shù)學(xué)函數(shù)和常量,用于進(jìn)行科學(xué)計(jì)算、幾何計(jì)算和其他數(shù)學(xué)相關(guān)的操作,這篇文章主要介紹了Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼,需要的朋友可以參考下2025-03-03服務(wù)器端Go程序?qū)﹂L(zhǎng)短鏈接的處理及運(yùn)行參數(shù)的保存
這篇文章主要介紹了服務(wù)器端Go程序?qū)﹂L(zhǎng)短鏈接的處理及運(yùn)行參數(shù)的保存,這里針對(duì)使用Go語言編寫的Socket服務(wù)器進(jìn)行實(shí)例說明,需要的朋友可以參考下2016-03-03Go語言實(shí)現(xiàn)并發(fā)控制的常見方式詳解
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)并發(fā)控制的幾種常見方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03Ubuntu18.04 LTS搭建GO語言開發(fā)環(huán)境過程解析
這篇文章主要介紹了Ubuntu18.04 LTS搭建GO語言開發(fā)環(huán)境過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Golang中實(shí)現(xiàn)簡(jiǎn)單的Http Middleware
本文主要針對(duì)Golang的內(nèi)置庫 net/http 做了簡(jiǎn)單的擴(kuò)展,實(shí)現(xiàn)簡(jiǎn)單的Http Middleware,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07golang 如何通過反射創(chuàng)建新對(duì)象
這篇文章主要介紹了golang 通過反射創(chuàng)建新對(duì)象的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go語言實(shí)現(xiàn)百萬級(jí)WebSocket連接架構(gòu)設(shè)計(jì)及服務(wù)優(yōu)化
本文將詳細(xì)介紹如何在Go中構(gòu)建一個(gè)能夠支持百萬級(jí)WebSocket連接的服務(wù),包括系統(tǒng)架構(gòu)設(shè)計(jì)、性能優(yōu)化策略以及具體的實(shí)現(xiàn)步驟和代碼示例2024-01-01