Go开发命令行程序指南( 五 )


import "context"然后你可以使用它的函数,如context.Background、context.WithCancel、context.WithTimeout等来创建和管理Context 。Context是一个携带取消信号和deadline的对象,可以跨越API边界 。比如说:ctx := context.Background() // 创建一个空的背景上下文(从不取消) 。ctx, cancel := context.WithCancel(ctx) // 创建一个新的上下文,可以通过调用cancel函数来取消 。defer cancel() // 在函数结束前执行ctx的取消动作// 将ctx传递给一些接受它作为参数的函数......select {case <-ctx.Done(): // 等待来自ctx的取消信号fmt.Println("Canceled by parent") return ctx.Err() // 从ctx返回一个错误值 default: // 如果没有收到取消信号就执行fmt.Println("成功完成") return nil // 不返回错误值 }4. CLI程序的退出状态代码惯例退出状态代码是一个整数,表示CLI程序是否成功执行完成 。CLI程序通过调用os.Exit或从main返回的方式返回退出状态值 。其他CLI程序或脚本可以可以检查这些退出状态码,并根据状态码值的不同执行不同的处理操作 。
业界有一些关于退出状态代码的约定和扩展,这些约定被许多CLI程序广泛采用 。其中一些主要的约定和扩展如下: 。

  • 退出状态代码为0表示程序执行成功(例如:os.Exit(0) )
  • 非零的退出状态代码表示失败(例如:os.Exit(1) ) 。
  • 不同的非零退出状态代码可能表示不同的失败类型或原因(例如:os.Exit(2)表示使用错误,os.Exit(3)表示权限错误等等) 。
  • 大于125的退出状态代码可能表示被外部信号终止(例如,os.Exit(130)为被信号中断) 。
遵循这些约定和扩展可以使你的CLI程序表现的更加一致、可靠并与其他CLI程序兼容 。然而,它们不是强制性的,你可以使用任何对你的程序有意义的退出状态代码 。例如,一些CLI程序使用高于200的退出状态代码来表示自定义或特定应用的错误(例如,os.Exit(255)表示未知错误) 。
五. 编写文档编写优秀CLI程序的另一个重要环节是编写清晰简洁的文档,解释你的程序做什么以及如何使用它 。文档可以采取各种形式,如README文件、usage信息、help flag等 。在本节中,我们将告诉你如何为你的程序写一个README文件,如何为你的程序写一个有用的usage和help flag等 。
1. 为你的CLI程序写一个清晰简洁的README文件README文件是一个文本文件,它提供了关于你的程序的基本信息,如它的名称、描述、用法、安装、依赖性、许可证和联系细节等 。它通常是用户或开发者在源代码库或软件包管理器上首次使用你的程序时会看到的内容 。
如果你要为Go CLI程序编写一个优秀的README文件,你应该遵循一些最佳实践,比如:
  • 使用一个描述性的、醒目的标题,反映你的程序的目的和功能 。
  • 提供一个简短的介绍,解释你的程序是做什么的,为什么它是有用的或独特的 。
  • 包括一个usage部分,说明如何用不同的标志、参数、子命令和选项来调用你的程序 。你可以使用代码块或屏幕截图来说明这些例子 。
  • 包括一个安装(install)部分,解释如何在不同的平台上下载和安装你的程序 。你可以使用go install、go get、goreleaser[24]或其他工具来简化这一过程 。
  • 指定你的程序的发行许可,并提供一个许可全文的链接 。你可以使用SPDX标识符[25]来表示许可证类型 。
  • 为想要报告问题、请求新功能、贡献代码或提问的用户或开发者提供联系信息 。你可以使用github issue、pr、discussion、电子邮件或其他渠道来达到这个目的 。
以下是一个Go CLI程序的README文件的示例供参考:
 
2. 为你的CLI程序编写有用的usage和help标志usage信息是一段简短的文字,总结了如何使用你的程序及其可用的标志、参数、子命令和选项 。它通常在你的程序在没有参数或输入无效的情况下运行时显示 。
help标志是一个特殊的标志(通常是-h或--help),它可以触发显示使用信息和一些关于你的程序的额外信息 。
为了给你的Go CLI程序写有用的usage信息和help标志,你应该遵循一些准则,比如说: