使用Go語言創(chuàng)建error的幾種方式小結(jié)
Go
語言函數(shù)(或方法)是支持多個(gè)返回值的,因此在Go
語言的編程哲學(xué)中,函數(shù)的返回值的最后一個(gè)通常都是error
類型:
//標(biāo)準(zhǔn)os包下的函數(shù) func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) }
把error
類型作為函數(shù)的最后一個(gè)返回值,其作用在于告訴調(diào)用者函數(shù)在執(zhí)行過程是否發(fā)生錯(cuò)誤,當(dāng)返回的error
值為nil
,表示函數(shù)正常執(zhí)行。
其實(shí),error
類型本質(zhì)上是一個(gè)Go
內(nèi)置的接口,其定義如下:
type error interface { Error() string }
從上面error
的定義可以看到error
接口只有一個(gè)Error()
方法。
遵循著Go
語言的編程哲學(xué),當(dāng)我們開發(fā)自己的函數(shù)時(shí)最好也把error
作為函數(shù)的最后一個(gè)返回值。
即然要返回error
類型,那么就必須先創(chuàng)建error
類型,怎么創(chuàng)建呢?在這篇文章我們簡(jiǎn)單學(xué)習(xí)三種創(chuàng)建error
類型的方式。
使用errors包
Go
標(biāo)準(zhǔn)庫errors
包為了我們提供了一個(gè)最簡(jiǎn)單的error
接口實(shí)現(xiàn):
//errors包errors.go文件 type errorString struct { s string } func (e *errorString) Error() string { return e.s }
從上面的定義可以看到errorString
實(shí)現(xiàn)了error
接口,且參數(shù)非常簡(jiǎn)單,只有一個(gè)文本信息,通過errors.New()
函數(shù)可以創(chuàng)建一個(gè)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ù)
有時(shí)候我們需要復(fù)雜的錯(cuò)誤信息,如果直接調(diào)用errors.New()
方法的話,需要自己拼接字符串,而標(biāo)準(zhǔn)庫fmt
包的Errorf()
函數(shù)可以格式化文本并返回一個(gè)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 }
自己實(shí)現(xiàn)error接口
上述的兩種創(chuàng)建error
類型方式,本質(zhì)上包內(nèi)部有一個(gè)error
接口的實(shí)現(xiàn),所以如果我們希望返回更詳細(xì)的錯(cuò)誤類型,方便調(diào)用者判斷,可以實(shí)現(xiàn)自己的錯(cuò)誤類型:
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": "測(cè)試"}, 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ì)是一個(gè)只有Error()
方法的接口,因此只要實(shí)現(xiàn)該方法就可以作為error
類型使用。
到此這篇關(guān)于使用Go語言創(chuàng)建error的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Go創(chuàng)建error內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解
mapstructure用于將通用的map[string]interface{}解碼到對(duì)應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時(shí)候,解析來自多種源頭的數(shù)據(jù)流時(shí),我們一般事先并不知道他們對(duì)應(yīng)的具體類型。只有讀取到一些字段之后才能做出判斷2023-01-01golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法
本文主要介紹了golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08go語言基礎(chǔ) seek光標(biāo)位置os包的使用
這篇文章主要介紹了go語言基礎(chǔ) seek光標(biāo)位置os包的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05Golang實(shí)現(xiàn)深拷貝reflect原理示例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解
在Golang中,文件目錄是指計(jì)算機(jī)文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲(chǔ)文件的一種方式,可以包含文件和其他子目錄,本文主要介紹了Golang中文件目錄操作的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-05-05