这个方法一般用来进行自定义错误的类型判断,具体操作如下
首先创建一个定义的错误结构体,并给上Error方法
type FuncErr struct {
msg string
code int
}
func (f FuncErr) Error() string {
return f.msg
}
这样一来FuncErr就符合golang的error接口,也就是个错误了。下面定义个函数返回这个错误
func throw2(s string, c int) error {
return FuncErr{
msg: s,
code: c,
}
}
参照下面官网上的例子,对错误进行类型判断
官网例子如下:
if _, err := os.Open("non-existing"); err != nil {
var pathError *fs.PathError
if errors.As(err, &pathError) {
fmt.Println("Failed at path:", pathError.Path)
} else {
fmt.Println(err)
}
}
官网上首先定义了一个路径错误的指针pathErr,errors.As的第二个参数则是这个指针的指针,我们按照这个写法来尝试一下
err7 := throw2("err7", 101)
var pt *FuncErr
if errors.As(err7, &pt) {
fmt.Println("是FuncErr")
} else {
fmt.Println("不是FuncErr")
}
上面代码运行起来实际上会输出“不是FuncErr”,这就很奇怪了。
实际上As函数是在使用reflect包对两个参数的类型进行比较,其中第二个参数是第一个参数类型的指针类型。
根据上面的throw2函数可以看出我们返回的是一个FuncErr的实例,那么As的第二个参数就应该是针对实例的指针,所以改成下面这样的情况就可以了
err7 := throw2("err7", 101)
var pt FuncErr //改动在这里,这个pt必须和err7是相同类型
if errors.As(err7, &pt) {
fmt.Println("是FuncErr")
} else {
fmt.Println("不是FuncErr")
}
当然也可以针对throw2函数返回值的类型进行修改,变成如下
func throw2(s string, c int) error {
return &FuncErr{
msg: s,
code: c,
}
}
这样也行,总之重点就在加粗的那一句话。