全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Golang CLI程序中如何输出错误_Golang终端程序错误提示规范

错误必须写到 stderr,使用 fmt.Fprintln(os.Stderr, err) 或 log.New(os.Stderr, "", 0).Println(err);错误信息应简洁具体,如 "open config.yaml: permission denied",不加 ERROR 等前缀;通过 %w 保留原始错误链,支持 errors.Is/As 检查;在 main 中统一处理错误输出与退出码,避免中间函数调用 os.Exit。

Go CLI 程序输出错误,核心是:用 os.Stderr 输出、不带多余前缀、末尾不加换行(由调用者控制)、错误信息清晰具体、不掩盖原始错误链。

错误必须写到 stderr,而不是 stdout

终端程序区分标准输出(stdout)和标准错误(stderr),前者用于正常结果,后者专用于错误和警告。用户可能重定向 stdout(如 mycmd > out.txt),但 stderr 仍会显示在终端,确保错误不被丢弃。

正确做法:

  • fmt.Fprintln(os.Stderr, "error: ...")
  • 或更推荐:log.New(os.Stderr, "", 0).Println("error: ...")(避免全局 log.SetOutput 影响其他部分)
  • 避免:fmt.Println("error: ...")(默认写到 stdout)

错误信息格式简洁明确,不加冗余前缀

不要自动加 ERROR:[ERR] 或时间戳——CLI 用户习惯阅读原生、紧凑的错误描述。前缀应由上层统一处理(比如主函数统一包装),或完全交由调用方决定。

好例子:

  • open config.yaml: permission denied(直接复用 err.Error()
  • invalid port number "abc": strconv.ParseInt: parsing "abc": invalid syntax

坏例子:

  • ERROR: open config.yaml: permission denied(前缀多余)
  • [2025-05-12 10:30:00] FATAL: ...(时间戳+级别对 CLI 不必要)

保留错误上下文与原始原因,善用 %werrors.Join

不要用 fmt.Sprintf("failed to read %s: %v", file, err) 吞掉原始 error。要支持错误检查(errors.Is / errors.As)和展开(errors.Unwrap)。

推荐写法:

  • return fmt.Errorf("read config file %q: %w", path, err)
  • 多个错误合并:errors.Join(err1, err2)(Go 1.20+)
  • 最终输出时,可调用 errors.Unwraperrors.Format(需自定义)展示全链,但多数 CLI 直接输出最外层 err.Error() 即可,够用且干净

主函数结尾统一处理错误退出

main() 函数中,用一个 if err != nil 块集中处理所有错误输出和退出码,保持逻辑清晰。

典型结构:

func main() {
    if err := run(); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

注意:

  • 不要在中间函数里调用 os.Exitlog.Fatal——这会让测试变困难、无法拦截错误
  • 若需不同退出码(如 2 表示命令行参数错),可用自定义错误类型实现 interface{ ExitCode() int },然后在 main 中判断

基本上就这些。不复杂但容易忽略——关键是把 stderr 当“错误专用通道”,把 error 当“可传递、可检查的数据”,而不是字符串日志。


# go  # golang  # ai  # if  # format  # Error  # 字符串  # 命令行参数  # int  # Interface  # nil  # number  # 写到  # 不加  # 错误信息  # 自定义  # 而不是  # 中统  # 多个  # 不被  # 不带  # 这会 


相关文章: 黑客如何通过漏洞一步步攻陷网站服务器?  如何自定义建站之星网站的导航菜单样式?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何在服务器上三步完成建站并提升流量?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  详解jQuery中基本的动画方法  香港服务器如何优化才能显著提升网站加载速度?  如何在腾讯云免费申请建站?  如何彻底删除建站之星生成的Banner?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  重庆网站制作公司哪家好,重庆中考招生办官方网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  建站主机选哪家性价比最高?  开源网站制作软件,开源网站什么意思?  如何续费美橙建站之星域名及服务?  代购小票制作网站有哪些,购物小票的简要说明?  如何通过智能用户系统一键生成高效建站方案?  如何用已有域名快速搭建网站?  如何在局域网内绑定自建网站域名?  制作旅游网站html,怎样注册旅游网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站制作难吗安全吗,做一个网站需要多久时间?  c# 服务器GC和工作站GC的区别和设置  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何快速完成中国万网建站详细流程?  网站制作服务平台,有什么网站可以发布本地服务信息?  建站之星安装后如何配置SEO及设计样式?  如何在建站之星网店版论坛获取技术支持?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  如何安全更换建站之星模板并保留数据?  清除minerd进程的简单方法  学校建站服务器如何选型才能满足性能需求?  小型网站建站如何选择虚拟主机?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  制作宣传网站的软件,小红书可以宣传网站吗?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站之星官网登录失败?如何快速解决?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  太原网站制作公司有哪些,网约车营运证查询官网?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何选择CMS系统实现快速建站与SEO优化?  css网站制作参考文献有哪些,易聊怎么注册?  如何在IIS中新建站点并解决端口绑定冲突?  建站之星如何实现PC+手机+微信网站五合一建站?  如何高效利用200m空间完成建站?  建站之星备案流程有哪些注意事项?  常州自助建站费用包含哪些项目?  公司门户网站制作流程,华为官网怎么做? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。