您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Go語言中error類型的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
error類型是go語言的一種內置類型,使用的時候不用特定去import,他本質上是一個接口
type error interface{ Error() string //Error()是每一個訂制的error對象需要填充的錯誤消息,可以理解成是一個字段Error }
怎樣去理解這個訂制呢?
我們知道接口這個東西,必須擁有它的實現塊才能調用,放在這里就是說,Error()必須得到填充,才能使用.
第一種:通過errors包去訂制error
error := errors.New("hello,error")//使用errors必須import "errors"包 if error != nil { fmt.Print(err) }
來解釋一下errors包,只是一個為Error()填充的簡易封裝,整個包的內容,只有一個New方法,可以直接看
func New(text string) error
第二種:通過fmt.Errorf()去訂制
err := fmt.Errorf("hello error") if err != nil { fmt.Print(err) }
可以說和第一種雷同了.
第三種:就是通過自定義的MyError塊去訂制了
//一個包裹了錯誤類型對象的自定義錯誤類型 type MyError struct { err error } //訂制Error() func (e MyError) Error() string { return e.err.Error() } func main() { err:=MyError{ errors.New("hello error"), } fmt.Println(err.Error()) }
三種方式差異都不大,輸出結果都是 hello error
實際上error只是一段錯誤信息,真正拋出異常并不是單純靠error,panic和recover的用法以后總結。
補充:go error接口與errors包詳解
定義:
type error interface{ Error() string //Error()是一個方法,是每一個訂制的error對象需要填充的錯誤消息,可以理解成是一個字段Error }
1.1 常見調用方式
模板
n, err := Foo(0) if err != nil { // 錯誤處理 } else { // 使用返回值 n }
練習1
package main import ( "fmt" "os" ) func main() { f, err := os.Open("/test.txt") if err != nil { fmt.Println(err) return } fmt.Println(f.Name(), "opened successfully") }
[root@localhost error]# go run err3.go
open /test.txt: no such file or directory
1.2 自定義error方法
1.2.1 函數調用error
func Foo(param int)(n int, err error) { // ... }
1.2.2 自定義Error模板1
type fileError struct { } func (fe *fileError) Error() string { return "文件錯誤" }
練習1
模擬一個錯誤
package main import "fmt" type fileError struct { } func (fe *fileError) Error() string { //自定義會覆蓋原來的Error接口 return "文件錯誤" } //只是模擬一個錯誤 func openFile() ([]byte, error) { return nil, &fileError{} } func main() { conent, err := openFile() if err != nil { fmt.Println(err) } else { fmt.Println(string(conent)) } }
[root@localhost error]# go run err1.go
文件錯誤
1.2 自定義Error模板2
自定義中添加一個字符串
type fileError struct { s string } func (fe *fileError) Error() string { return fe.s }
練習2
聲明fileError的時候,設置好要提示的錯誤文字
package main import "fmt" type fileError struct { s string } func (fe *fileError) Error() string { return fe.s } //只是模擬一個錯誤 func openFile() ([]byte, error) { return nil, &fileError{"文件錯誤,自定義"} } func main() { conent, err := openFile() if err != nil { fmt.Println(err) } else { fmt.Println(string(conent)) } }
[root@localhost error]# go run err2.go
文件錯誤,自定義
練習3
添加一個時間刻度
package main import ( "fmt" "time" ) type MyError struct { When time.Time What string } func (e MyError) Error() string { return fmt.Sprintf("%v: %v", e.When, e.What) } func oops() error { return MyError{ time.Date(1989, 3, 15, 22, 30, 0, 0, time.UTC), "the file system has gone away", } } func main() { if err := oops(); err != nil { fmt.Println(err) } }
[root@localhost error]# go run err4.go
1989-03-15 22:30:00 +0000 UTC: the file system has gone away
練習三
沒有打開文件報錯
package main import ( "fmt" "os" ) type PathError struct { Op string Path string Err error } func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() } func main() { f, err := os.Open("/test.txt") if errObject, ok := err.(*os.PathError); ok { fmt.Println("錯誤輸出:",err, "文件路徑:", errObject.Path) return } fmt.Println(f.Name(), "opened successfully") }
[root@localhost error]# go run err5.go
錯誤輸出: open /test.txt: no such file or directory 文件路徑: /test.txt
2.1 獲取error包
go get github.com/pkg/errors
2.2 errors.New()
errors.New()接收合適的錯誤信息來創建
先聲明再使用
l練習1
package main import ( "errors" "fmt" ) var errNotFound error = errors.New("Not found error") func main() { fmt.Printf("error: %v", errNotFound) }
[root@localhost error]# go run errs1.go
error: Not found error
練習2
函數如何調用err
直接使用
package main import ( "errors" "fmt" ) func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("math - square root of negative number") }else { return 1, errors.New("math - square root of 10") } } func main() { if _, err := Sqrt(-1); err != nil { fmt.Printf("Error: %s\n", err) } }
[root@localhost error]# go run errs2.go
Error: math - square root of negative number
比較自定義error與errors.New()函數根據需求其實各有優點。
package main import ( "errors" "fmt" ) type MsgError struct { Code int Msg string } func (msg *MsgError) Error() string { return fmt.Sprintf("%s", msg.Msg) } func f1(code int) (int, error) { if code == 1 { return -1, errors.New("msg test error") } return code, nil } func f2(code int) (int, error) { if code == 1 { return -1, &MsgError{code, "struct msg test error"} } return code, nil } func main() { for _, v := range []int{1, 2, 3, 4, 5, 6} { if code, err := f1(v); err != nil { fmt.Println(err) } else { fmt.Println("success:", code) } } for _, i := range []int{1, 2, 3} { if code, err := f2(i); err != nil { fmt.Println(err) } else { fmt.Println("success:", code) } } }
[root@localhost error]# go run errs3.go msg test error success: 2 success: 3 success: 4 success: 5 success: 6 struct msg test error success: 2 success: 3
上述就是小編為大家分享的Go語言中error類型的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。