【golang】关于errors.As两个参数的问题记录

本文介绍如何在Golang中自定义错误类型并进行类型判断。通过示例代码详细展示了FuncErr结构体的定义及其使用方法,同时解释了如何利用errors.As进行错误类型检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

首先创建一个定义的错误结构体,并给上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,
	}
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值