Go中如何定义错误码常量_Go错误码管理最佳方式
技术百科
P粉602998670
发布时间:2026-01-24
浏览: 次 业务错误码不推荐用int,应定义自定义类型ErrorCode并封装AppError结构体,通过构造函数统一创建、绑定上下文,HTTP状态码映射应在transport层独立处理,全局错误码需按模块命名、集中管理、CI校验。
错误码该不该用 int 类型定义
Go 官方生态(如 net/http、os)普遍用 int 表示系统级错误码,但业务错误码**不推荐直接用 int 常量**。原因很实际:类型丢失导致易误用、无法携带上下文、IDE 无法跳转到定义、难以批量校验重复值。
- 用
int定义:const ErrUserNotFound = 404→ 调用时可能被当成任意整数传入,编译器不报错 - 更安全的做法是定义自定义类型:
type ErrorCode int const ( ErrUserNotFound ErrorCode = 1001 ErrInvalidToken ErrorCode = 1002 )
- 配合
String()方法还能让日志输出可读名:func (e ErrorCode) String() string { ... }
如何让错误码和 error 实例绑定
单纯定义常量没用,关键是要让每个错误码能生成带上下文的 error。别写 errors.New("user not found") 这种无结构的字符串错误。
- 用结构体封装错误码 + 消息 + 可选字段:
type AppError struct { Code ErrorCode Message string TraceID string } func (e *AppError) Error() string { return e.Message } func (e *AppError) StatusCode() int { return int(e.Code) } - 提供构造函数,强制走统一出口:
NewUserNotFoundError("user id: 123")内部自动填Code: ErrUserNotFound - 避免在 handler 层手动 new
&AppError{...}—— 构造逻辑收口后,后续加 trace、metrics、i18n 才可控
错误码和 HTTP 状态码怎么映射才不混乱
业务错误码(如 1001)和 HTTP 状态码(如 404)是两层概念,硬性一一对应会出问题。比如 ErrRateLimited 应该返回 429,但 ErrInternalFailure 在调试环境可能返回 500,上线后却要返回 503。
- 不要在错误码常量里塞 HTTP 状态码:
const ErrUserNotFound = 404是典型反模式 - 用独立映射表或方法做转换:
func (e ErrorCode) HTTPStatus() int { switch e { case ErrUserNotFound:
return 404 case ErrRateLimited: return 429 default: return 500 } }
- 映射逻辑放在 transport 层(如 HTTP handler),而不是 domain 层 —— 错误码本身应与协议无关
全局错误码表怎么维护才不易冲突
多人协作时,最怕两个模块都定义了 ErrInvalidParam = 1000。靠文档约定或人工 review 不可靠。
- 按模块划分命名空间:
user.ErrInvalidEmail、order.ErrInsufficientStock,类型也分包定义 - 所有错误码常量集中在一个
errors/code.go文件,禁止分散定义;用注释标注用途和责任人:// ErrInvalidEmail user module, used in email validation // @owner: auth-team const ErrInvalidEmail ErrorCode = 2001
- CI 加一道检查:用
go list -f '{{.ImportPath}}' ./... | xargs -I{} go tool vet -shadow {}配合自定义脚本扫重复值
ErrTimeout 在三个服务里含义不同、HTTP 状态码被前端硬编码、日志里只看到数字看不到上下文——那些地方,往往没在定义时就设计好边界。
# ai
# 放在
# 能让
# 可选
# 时就
# 要让
# 绑定
# 错误码
# 自定义
# app
# http
# go
# Error
# String
# int
# 编码
# 构造函数
# 字符串
# 接口
# 报错
# 前端
# 封装
# 结构体
# 命名空间
# switch
# 状态码
# const
# 常量
# ide
# 应在
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Mac如何与安卓手机传文件_Mac和Android
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- Win11怎么设置ip地址_Windows 11手
- Win11怎么更改账户头像_Windows 11自
- php下载安装后memory_limit怎么设置_
- Windows10怎么备份注册表_Windows1
- C++如何使用std::async进行异步编程?(
- Go语言中正确反序列化多个同级XML元素为结构体切
- Windows11怎样开启游戏模式_Windows
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11怎么恢复出厂设置_Win11重置此电脑保
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Windows10如何重置此电脑_Windows1
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- php下载安装选zip还是msi格式_两种安装包对
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Win11怎么设置默认浏览器Chrome_Wind
- Win11局域网共享怎么设置 Win11文件夹网络
- 如何使用Golang搭建本地API测试环境_快速验
- Win10怎么卸载剪映_Win10彻底卸载剪映方法
- Python大文件处理策略_内存优化说明【指导】
- c++如何用AFL++进行模糊测试 c++ Fuz
- Win10怎样设置多显示器_Win10多显示器扩展
- Python对象比较与排序_集合使用说明【指导】
- Windows10如何更改盘符名称_Win10重命
- Win11相机打不开提示错误怎么修_相机权限开启与
- mac怎么查看wifi密码_MAC查看已连接WiF
- Win11如何设置环境变量 Win11添加和修改系
- Win11怎么设置夜间模式_Windows11显示
- C++如何将C风格字符串(char*)转换为std
- Python异步网络编程_aiohttp说明【指导
- php中::能用于接口静态方法吗_接口静态方法调用
- Win11如何设置电源计划_Win11电源计划优化
- Win10怎样安装PPT模板_Win10安装PPT
- 如何使用Golang实现Web表单数据绑定_自动映
- 静态属性修改会影响所有实例吗_php作用域操作符下
- Win11怎么更改电脑密码_Windows 11修
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- php8.4如何调用com组件_php8.4win
- 如何在 Laravel 中通过嵌套关联关系进行 o
- 如何将文本文件中的竖排字符串转换为横排字符串
- PythonFastAPI项目实战教程_API接口
- Win11怎么设置按流量计费_Win11限制后台流
- C++中引用和指针有什么区别?(代码说明)
- c++中如何使用虚函数实现多态_c++多态性实现原
- php8.4新语法match怎么用_php8.4m
- Windows11怎么用“记事本”自动换行与编码
- 如何理解Go指针和内存分配关系_Go Pointe
- Mac如何备份到iCloud_Mac桌面与文稿文件


QQ客服