使用Go語言創(chuàng)建error的幾種方式小結(jié)
Go
語言函數(shù)(或方法)是支持多個返回值的,因此在Go
語言的編程哲學(xué)中,函數(shù)的返回值的最后一個通常都是error
類型:
//標(biāo)準(zhǔn)os包下的函數(shù) func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) }
把error
類型作為函數(shù)的最后一個返回值,其作用在于告訴調(diào)用者函數(shù)在執(zhí)行過程是否發(fā)生錯誤,當(dāng)返回的error
值為nil
,表示函數(shù)正常執(zhí)行。
其實,error
類型本質(zhì)上是一個Go
內(nèi)置的接口,其定義如下:
type error interface { Error() string }
從上面error
的定義可以看到error
接口只有一個Error()
方法。
遵循著Go
語言的編程哲學(xué),當(dāng)我們開發(fā)自己的函數(shù)時最好也把error
作為函數(shù)的最后一個返回值。
即然要返回error
類型,那么就必須先創(chuàng)建error
類型,怎么創(chuàng)建呢?在這篇文章我們簡單學(xué)習(xí)三種創(chuàng)建error
類型的方式。
使用errors包
Go
標(biāo)準(zhǔn)庫errors
包為了我們提供了一個最簡單的error
接口實現(xiàn):
//errors包errors.go文件 type errorString struct { s string } func (e *errorString) Error() string { return e.s }
從上面的定義可以看到errorString
實現(xiàn)了error
接口,且參數(shù)非常簡單,只有一個文本信息,通過errors.New()
函數(shù)可以創(chuàng)建一個errorString
類型:
package school import "errors" type Student struct { ID int Name string Score int } func NewStudent(id int, name string, score int) (*Student, error) { if id <= 0 { return nil, errors.New("id could not less than 0") } if score < 0 || score > 100 { return nil, errors.New("score must between 0 and 100") } return &Student{id, name, score}, nil }
fmt.Errorf()函數(shù)
有時候我們需要復(fù)雜的錯誤信息,如果直接調(diào)用errors.New()
方法的話,需要自己拼接字符串,而標(biāo)準(zhǔn)庫fmt
包的Errorf()
函數(shù)可以格式化文本并返回一個error
類型:
package school import ( "fmt" ) type Student struct { ID int Name string Score int } func NewStudent(id int, name string, score int) (*Student, error) { if id <= 0 { return nil, fmt.Errorf("%d is less than 0", id) } if score < 0 || score > 100 { return nil, fmt.Errorf("%d is not between 0 and 100", score) } return &Student{id, name, score}, nil }
自己實現(xiàn)error接口
上述的兩種創(chuàng)建error
類型方式,本質(zhì)上包內(nèi)部有一個error
接口的實現(xiàn),所以如果我們希望返回更詳細的錯誤類型,方便調(diào)用者判斷,可以實現(xiàn)自己的錯誤類型:
package main import ( "fmt" "net/http" ) type ResponseError struct { code int message string } func (r ResponseError) Error() string { return fmt.Sprintf(`{"code":%d,"message":"%s"}`, r.code, r.message) } func getUser(id string) (map[string]string, error) { if len(id) == 0 { return nil, &ResponseError{1, "id不能為空"} } return map[string]string{"id": id, "name": "測試"}, nil } func main() { http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { id := r.FormValue("id") user, err := getUser(id) if err != nil { fmt.Fprint(w, err) return } fmt.Fprint(w, user) }) http.ListenAndServe(":80", nil) }
小結(jié)
error
類型是Go
語言的內(nèi)置類型,其本質(zhì)是一個只有Error()
方法的接口,因此只要實現(xiàn)該方法就可以作為error
類型使用。
到此這篇關(guān)于使用Go語言創(chuàng)建error的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Go創(chuàng)建error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解
mapstructure用于將通用的map[string]interface{}解碼到對應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時候,解析來自多種源頭的數(shù)據(jù)流時,我們一般事先并不知道他們對應(yīng)的具體類型。只有讀取到一些字段之后才能做出判斷2023-01-01go語言基礎(chǔ) seek光標(biāo)位置os包的使用
這篇文章主要介紹了go語言基礎(chǔ) seek光標(biāo)位置os包的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Golang實現(xiàn)深拷貝reflect原理示例探究
這篇文章主要為大家介紹了Golang實現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01