Go错误处理需结合自定义类型与错误包装:用%w保留原始错误,errors.Is判断哨兵错误,errors.As安全提取自定义错误,避免==比较。
在 Go 中,errors 包提供了创建和处理错误的基础能力,但真正灵活、可维护的错误处理往往需要结合自定义错误类型和更丰富的上下文信息。Go 1.13 引入的错误包装(`%w`)和 `errors.Is`/`errors.As` 等函数,让错误链和类型断言变得更可靠。
最简单的方式是用 errors.New 创建静态字符串错误,或用 fmt.Errorf 动态拼接带变量的信息:
err := errors.New("failed to open config file")err := fmt.Errorf("failed to parse %s: %v", filename, errParse)注意:直接拼接字符串会丢失原始错误,如需保留底层原因,应使用 %w 动词进行包装:
err := fmt.Errorf("loading config: %w", os.Open(filename))当需要区分错误种类、携带结构化字段(如错误码、重试标志、HTTP 状态码),可定义结构体并实现 Error() string 方法:
type ValidationError struct {
Field string
Message string
Code int
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
}
这样既能提供可读信息,又支持类型断言判断错误类型:
if ve, ok := err.(*ValidationError); ok { /* 处理校验错误 */ }相比类型断言,errors.As 能穿透多层包装找到目标错误类型,更健壮:
var ve *ValidationError
if errors.As(err, &ve) {
log.Printf("Validation error on %s, code: %d", ve.Field, ve.Code)
}它会从最内层错误开始逐级检查,直到匹配或遍历完错误链。
s.Is 判断是否为特定错误(常用于哨兵错误)对于预定义的全局错误变量(哨兵错误),推荐用 errors.Is 判断相等性,它同样支持错误链:
var ErrNotFound = errors.New("not found")
// 即使 err 是 fmt.Errorf("user not found: %w", ErrNotFound),仍能匹配
if errors.Is(err, ErrNotFound) {
return http.StatusNotFound
}
避免直接用 == 比较,因为包装后的错误地址已变。
# go
# golang
# ai
# 状态码
# String
# if
# Error
# 字符串
# 结构体
# 接口
# 对象
# http
# 自定义
# 遍历
# 如需
# 它会
# 最简单
# 既能
# 或用
# 仍能
# 重试
# 结构化
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】
Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】
Windows 10怎么录屏_Windows 10使用Xbox Game Bar录制屏幕视频教程
Python项目维护经验_长期演进说明【指导】
windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】
windows系统如何安装cab更新补丁_windows手动安装更新包教程
Python包结构设计_大型项目组织解析【指导】
c# 服务器GC和工作站GC的区别和设置
Win10怎么设置开机密码_Windows10账户登录密码设置与取消
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
Python集合操作技巧_高效去重解析【教程】
如何理解Go指针和内存分配关系_Go Pointer内存Model解析
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
Win11如何连接Xbox手柄 Win11蓝牙连接游戏手柄教程【步骤】
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
Python多进程教程_multiprocessing模块实战
Django 密码修改后会话失效的解决方案
如何在Golang中使用replace替换模块_指定本地或远程路径
如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法
Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】
php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】
windows系统找不到无线网络怎么办_windows WLAN适配器故障排查
c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】
Flask 表单数据通过 SMTP 发送邮件的完整实现教程
Win10如何更改开机密码_Windows10登录选项更改密码
如何在 Laravel 中通过嵌套关联关系进行 orderBy 排序
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】
Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用
MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录
php485函数执行慢怎么优化_php485性能提升小技巧【技巧】
c++中如何进行二进制文件读写_c++ read与write函数用法
Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】
Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】
如何在 VS Code 中正确配置并使用 NumPy
Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】
Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
怎么将XML数据可视化 D3.js加载XML
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
Win11关机快捷键是什么_Win11快速关机方法【大全】
如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化
Go语言中正确反序列化多个同级XML元素为结构体切片的方法
Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】
2025-12-25
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。