所有业务错误必须用自定义结构体封装,Error()仅返回Code字符串,翻译严格延迟至HTTP handler末尾或CLI输出前,通过MessageID查表实现多语言,确保错误链完整、日志可分析、errors.Is有效。

Golang错误处理与国际化(i18n)_根据语言返回错误消息

错误不能在创建时就翻译,必须延迟到响应前

Go 的 error 接口返回的是固定字符串,一旦用 errors.New("用户不存在")fmt.Errorf("数据库连接失败: %w", err) 写死文本,后续就无法按语言切换——不是技术做不到,而是会破坏错误链、干扰日志分析、让 errors.Is 失效。

用 MessageID 当钥匙,别把语言塞进 error 结构里

MessageID 是纯标识符,像 "user_not_found""auth.token_expired",它不带空格、不带标点、不带语言信息,只用于查表。一旦在结构体里存了中文或英文文案,就等于把 locale 耦合进了错误创建逻辑,同一错误在不同请求中可能被反复翻译成不同语言,导致日志混乱、监控失真。

go-i18n 加载和查找有隐性规则,错一个就静默失败

go-i18n/v2 不会自动扫描目录加载文件,也不会 fallback 到默认语言——它靠你显式调用 bundle.LoadMessageFile,且文件名必须符合 BCP 47 规范(zh-CN.json 可以,zh_CN.json 就找不到)。

HTTP 响应体要同时返回 code、error_id 和 localized message

前端需要 code 做逻辑判断(比如跳登录页),运维需要 error_id 查日志上下文,用户才需要 localized message。三者缺一不可,只返回翻译后的字符串等于扔掉调试线索。

最常被忽略的一点是:错误码和 JSON 翻译 key 的一致性没法靠编译器保证,得靠 CI 脚本做校验——比如扫描所有 AppError{Code: "..."} 实例,比对是否都在 en.jsonzh-CN.json 里存在对应项。漏一条,线上就有一处错误永远显示 “unknown_error”。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。