理解二叉樹深度定義,思路剖析後可以使用深度優先搜索,這麼高大上的名字背後使用的是遞歸函數,遞歸三要素還可以回憶到嗎?還是已經拋到九霄雲外了! ...
在 Go 語言中,error
是一個內置的介面類型,用於表示錯誤情況。error
介面的定義如下:
type error interface {
Error() string
}
任何具有 Error() string
方法的類型都可以被視為實現了 error
介面。
創建自定義錯誤
儘管 Go 提供了 errors.New
函數用於創建簡單的錯誤信息,但有時候,我們可能需要創建更複雜的自定義錯誤。這可以通過定義一個實現了 Error
方法的結構體來實現:
type MyError struct {
Msg string
File string
Line int
}
func (e *MyError) Error() string {
return fmt.Sprintf("%s:%d: %s", e.File, e.Line, e.Msg)
}
在這個例子中,MyError
包含了一個錯誤消息、文件名和行號。Error
方法返回一個格式化的錯誤字元串。
創建 MyError
的實例:
err := &MyError{
Msg: "something went wrong",
File: "main.go",
Line: 42,
}
fmt.Println(err) // 輸出 "main.go:42: something went wrong"
錯誤的包裝和解包
在處理錯誤時,我們有時候會遇到需要將一個錯誤包裝到另一個錯誤中的情況,這可以通過 fmt.Errorf
函數和 %w
動詞實現:
func Foo() error {
return errors.New("foo failed")
}
func Bar() error {
err := Foo()
if err != nil {
return fmt.Errorf("bar failed: %w", err)
}
return nil
}
err := Bar()
if err != nil {
fmt.Println(err) // 輸出 "bar failed: foo failed"
}
在這個例子中,Bar
函數調用了 Foo
函數,如果 Foo
函數返回了一個錯誤,Bar
函數會將這個錯誤包裝到它自己的錯誤中。
你可以使用 errors.As
函數檢查錯誤是否為特定的類型,或者使用 errors.Unwrap
函數獲取被包裝的錯誤。
理解並正確使用 error
介面是編寫 Go 程式的關鍵,因為大多數函數和方法都會返回一個 error
類型的值來表示可能的錯誤情況。
推薦閱讀:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g