使用Go语言创建error的几种方式小结
Go
语言函数(或方法)是支持多个返回值的,因此在Go
语言的编程哲学中,函数的返回值的最后一个通常都是error
类型:
//标准os包下的函数 func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) }
把error
类型作为函数的最后一个返回值,其作用在于告诉调用者函数在执行过程是否发生错误,当返回的error
值为nil
,表示函数正常执行。
其实,error
类型本质上是一个Go
内置的接口,其定义如下:
type error interface { Error() string }
从上面error
的定义可以看到error
接口只有一个Error()
方法。
遵循着Go
语言的编程哲学,当我们开发自己的函数时最好也把error
作为函数的最后一个返回值。
即然要返回error
类型,那么就必须先创建error
类型,怎么创建呢?在这篇文章我们简单学习三种创建error
类型的方式。
使用errors包
Go
标准库errors
包为了我们提供了一个最简单的error
接口实现:
//errors包errors.go文件 type errorString struct { s string } func (e *errorString) Error() string { return e.s }
从上面的定义可以看到errorString
实现了error
接口,且参数非常简单,只有一个文本信息,通过errors.New()
函数可以创建一个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()函数
有时候我们需要复杂的错误信息,如果直接调用errors.New()
方法的话,需要自己拼接字符串,而标准库fmt
包的Errorf()
函数可以格式化文本并返回一个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 }
自己实现error接口
上述的两种创建error
类型方式,本质上包内部有一个error
接口的实现,所以如果我们希望返回更详细的错误类型,方便调用者判断,可以实现自己的错误类型:
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) }
小结
error
类型是Go
语言的内置类型,其本质是一个只有Error()
方法的接口,因此只要实现该方法就可以作为error
类型使用。
到此这篇关于使用Go语言创建error的几种方式小结的文章就介绍到这了,更多相关Go创建error内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论