Golang 中的 Errors 包詳解,你都了解嗎?
在 Golang 中,errors 包是用于處理錯(cuò)誤的標(biāo)準(zhǔn)庫(kù), errors 包提供的功能比較簡(jiǎn)單,使用起來(lái)非常方便。接下來(lái)就具體講解一下 errors 包提供的幾個(gè)函數(shù)。
errors.New
func New(text string) error
錯(cuò)誤處理是開(kāi)發(fā)過(guò)程中必不可少的,使用 errors.New 函數(shù)可以創(chuàng)建一個(gè)表示特定錯(cuò)誤的對(duì)象。接受一個(gè)字符串類(lèi)型的參數(shù)(用于描述錯(cuò)誤信息),返回一個(gè) error 類(lèi)型的值。例如:
package main
import "errors"
func main() {
err := errors.New("invalid input")
}
error 類(lèi)型是 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ò)誤類(lèi)型或者基于目標(biāo)錯(cuò)誤類(lèi)型包裝過(guò)的錯(cuò)誤,會(huì)遞歸檢查錯(cuò)誤鏈,直到找到目標(biāo)錯(cuò)誤類(lèi)型或者到達(dá)錯(cuò)誤鏈的末尾。如果找到目標(biāo)錯(cuò)誤類(lèi)型,則返回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 包裝出來(lái)的,所以使用 Is 判斷會(huì)返回 true。
errors.AS
func As(err error, target any) bool
用于將錯(cuò)誤轉(zhuǎn)換為特定類(lèi)型的錯(cuò)誤,As 函數(shù)會(huì)檢查 err 是否是 target 指向的類(lèi)型的實(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 來(lái)檢查 err 是否是 MyError 類(lèi)型的實(shí)例,并將實(shí)例賦值給 target。運(yùn)行一下示例看下效果
$ go run main.go
Custom error found: This is a custom error
這個(gè)功能通常用于處理不同類(lèi)型的錯(cuò)誤,根據(jù)錯(cuò)誤的類(lèi)型采取對(duì)應(yīng)的處理方式。
errors.Unwrap
func Unwrap(err error) error
用于將一個(gè)錯(cuò)誤對(duì)象展開(kāi),得到下一層錯(cuò)誤對(duì)象,如果錯(cuò)誤對(duì)象沒(méi)有下一層錯(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,然后通過(guò)使用 Unwrap 將 err 解包并得包裝前的錯(cuò)誤對(duì)象 originalErr。需要注意的是 Unwrap 只能展開(kāi)被 fmt.Errorf 包裝的錯(cuò)誤對(duì)象。如果想要展開(kāi)其他類(lèi)型的錯(cuò)誤對(duì)象,可以使用類(lèi)型斷言操作符 `.` 進(jìn)行類(lèi)型斷言。
小結(jié)
errors 包提供了一些簡(jiǎn)單易用的函數(shù)來(lái)處理和獲取錯(cuò)誤信息,借助 errors 包可以實(shí)現(xiàn)非常強(qiáng)大的錯(cuò)誤處理功能。