errors.As用于从错误链中提取特定类型错误,通过传入指针变量实现安全类型断言,适用于判断包装错误中是否存在某类型并获取实例,如自定义错误*MyError;与errors.Is不同,Is用于判断错误值是否匹配,而As用于类型匹配和提取;使用时需传入目标指针,如&myErr,确保类型一致,适合处理fmt.Errorf包装的错误,提升错误处理灵活性。

在Go语言中,错误处理是程序健壮性的重要组成部分。当函数调用链中返回的错误经过多层包装后,我们往往需要判断某个特定类型的错误是否存在于错误链中。Go 1.13引入了
errors.As
errors.As用于判断一个错误(或其底层包装的错误)是否是某个具体类型的实例。如果匹配成功,它会将该错误赋值给传入的指针变量,从而实现类型提取。
这在处理包装错误(wrapped errors)时非常有用,比如使用
fmt.Errorf("...: %w", err)假设你有一个自定义错误类型:
立即学习“go语言免费学习笔记(深入)”;
type MyError struct {
Msg string
}
func (e *MyError) Error() string {
return e.Msg
}
某函数返回一个包装了
*MyError
func doSomething() error {
return fmt.Errorf("something went wrong: %w", &MyError{Msg: "custom error occurred"})
}
在调用处,你可以使用
errors.As
err := doSomething()
var myErr *MyError
if errors.As(err, &myErr) {
fmt.Println("Caught custom error:", myErr.Msg)
}
上面代码中,
errors.As
*MyError
myErr
true
errors.Is(err, target)用于判断错误链中是否存在与目标错误相等的错误(通过
Is
errors.As(err, &target)用于判断错误链中是否存在某个类型匹配的错误,并提取出来。
例如:
errors.Is
os.ErrNotExist
errors.As
&myErr
As
*T
errors.As
Unwrap
As
As
基本上就这些。合理使用
errors.As
以上就是Golang使用errors.As类型断言捕获错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号