描述
error本质上是一个接口,任何实现该接口的结构体都是error。
type error interface {
Error() string
}
使用
func f1(arg int) (float64, error) {
if arg == 0 {
return 0, errors.New("can't work with 0")
}
return 1 / float64(arg), nil
}
这是一个计算倒数的方法。如果传入的参数是0,那么返回error。
arg1 := 10
r1, e1 := f1(arg1)
fmt.Println("arg:", arg1, "return:", r1, "error:", e1)
arg2 := 0
r2, e2 := f1(arg2)
fmt.Println("arg:", arg2, "return:", r2, "error:", e2)
arg: 10 return: 0.1 error:
arg: 0 return: 0 error: can’t work with 0
自定义error
任何实现error接口方法的构造体都可作为error使用。
type ArgError struct {
arg int
prob string
}
func (e *ArgError) Error() string {
return fmt.Sprintf("%d - %s", e.arg, e.prob)
}
func f1(arg int) (float64, error) {
if arg == 0 {
return 0, errors.New("can't work with 0")
}
return 1 / float64(arg), nil
}
func f2(arg int) (float64, error) {
if arg == 0 {
return 0, &ArgError{arg, "can't work with it"}
}
return 1 / float64(arg), nil
}
arg1 := 0
r1, e1 := f1(arg1)
fmt.Println("arg:", arg1, "return:", r1, "error:", e1)
arg2 := 0
r2, e2 := f2(arg2)
fmt.Println("arg:", arg2, "return:", r2, "error:", e2)
arg: 0 return: 0 error: can’t work with 0
arg: 0 return: 0 error: 0 - can’t work with it
如果需要自定义error,可以转换。
arg := 0
_, e := f2(arg)
ae, ok := e.(*ArgError)
fmt.Println("is ArgError:", ok, "arg:", ae.arg, "prob:", ae.prob)
is ArgError: true arg: 0 prob can’t work with it