golang关于errors.As两个参数的问题记录
admin
2024-02-02 04:44:28

这个方法一般用来进行自定义错误的类型判断,具体操作如下

首先创建一个定义的错误结构体,并给上Error方法

type FuncErr struct {msg  stringcode 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.PathErrorif 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,}
}

这样也行,总之重点就在加粗的那一句话。

相关内容

热门资讯

最新或2023(历届)上海交通... 上海交通大学最新或2023(历届)保送生招生简章  为贯彻《国务院关于深化考试招生制度改革的实施意...
最新或2023(历届)河海大学... 河海大学最新或2023(历届)保送生选拔预告 河海大学最新或2023(历届)继续面向全国招收保送生。...
最新或2023(历届)浙江三位... 最新或2023(历届)浙江三位一体招生要求和报名条件为贯彻国家和省中长期教育改革和发展规划纲要精神,...
最新或2023(历届)浙江三位... 据省教育厅昨天统计,今年共有52所院校参与招生试点,比去年增加15所。除浙江大学、上海交通大学、中国...
最新或2023(历届)浙江三位... 浙江特殊教育职业学院率先开始“三位一体”招生  最新或2023(历届)高校“三位一体”已经悄悄拉开...