errors.Is用于判断错误是否等于目标错误或被其包装,可穿透多层包装。使用%w包装错误时,errors.Is能递归匹配错误链,适合判断预定义错误值,而errors.As用于类型断言和提取自定义错误类型。

在Go语言中,判断错误是否为某个特定类型的错误是常见需求。从Go 1.13开始,errors.Is 函数被引入,用于比较两个错误是否“相等”,它能穿透包装的错误(wrapped errors),逐层检查是否与目标错误匹配。
理解 errors.Is 的作用
errors.Is(err, target) 的作用是判断 err 是否与 target 是同一个错误,或是否被包装了该目标错误。相比直接用 == 比较,它更强大,因为它会递归检查错误链中的每一个包装层。
例如:一个错误可能被多次包装,但只要其中某一层是目标错误,errors.Is 就会返回 true。
基本使用方法
假设你有一个函数返回一个包装过的错误,你可以用 errors.Is 来判断原始错误是否是你关心的那个:
立即学习“go语言免费学习笔记(深入)”;
import “errors” import “fmt” var ErrNotFound = errors.New(“not found”) func main() { err := someFunc() if errors.Is(err, ErrNotFound) { fmt.Println(“资源未找到”) } } func someFunc() error { return fmt.Errorf(“操作失败: %w”, ErrNotFound) }
这里 %w 是关键,它表示将 ErrNotFound 包装进新错误中。如果没有使用 %w,而是用 %v,那么错误就不会被包装,errors.Is 也无法识别。
Revid AI
AI短视频生成平台
96 查看详情
处理多层包装的情况
即使错误被多层包装,errors.Is 依然有效:
err1 := fmt.Errorf(“level 1: %w”, ErrNotFound) err2 := fmt.Errorf(“level 2: %w”, err1) err3 := fmt.Errorf(“top level: %w”, err2) if errors.Is(err3, ErrNotFound) { fmt.Println(“最终错误是 not found”) // 会输出 }
这说明 errors.Is 会沿着错误链一直往下找,直到发现匹配的错误或结束。
与 errors.As 的区别
注意不要混淆 errors.Is 和 errors.As:
errors.Is 用于判断是否是某个具体的错误值(如 ErrNotFound) errors.As 用于判断错误链中是否包含某个类型的错误(比如 *MyError),并提取出来
如果你定义的是自定义错误类型,应该用 errors.As;如果是预定义的错误变量,用 errors.Is 更合适。
基本上就这些。只要记住使用 %w 包装错误,并用 errors.Is 做判断,就能正确处理常见的错误匹配场景。
以上就是Golang如何使用errors.Is判断错误的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1089650.html
微信扫一扫
支付宝扫一扫