Go 语言工具链

工具链

Go 语言工具链(Go toolchain)是一组核心工具,用于帮助开发、构建、测试、维护和分发 Go 应用程序。这些工具由 Go 语言开发团队设计和维护,其中最常用工具会被包含在发行版(安装包)中。额外工具和库位于 golang.org/x 命名空间中,包含特定或高级功能,也被称为 Go 扩展库(Go eXtensions)。

内置工具在命令行直接执行,是日常开发中必备功能,例如打包和测试。而外置工具需要通过 go install 命令安装后才能使用,扩展库外置可以避免语言核心变得过于庞大。

内置工具

在命令行单独输入 go 命令时,子命令都对应着内置工具。主要是下面这些:

  • build:编译源代码包及其依赖,对 main 包编译将生成一个可执行文件。
  • clean:删除源码包中编译生成物。
  • doc:显示 Go 内置文档,支持第三方包。
  • env:打印 Go 语言环境变量信息。
  • fix:修复 Go 版本升级后不兼容代码。
  • fmt:格式化代码。
  • get:下载并安装指定包到本地,支持 GitHub 地址。从 Go 1.11 版本开始,默认启用模块模式,功能变为添加项目依赖模块并更新 go.mod 文件,也用于更新模块版本。
  • install:编译并安装指定包,生成可执行文件到 bin 目录,包文件到 pkg 目录。从 Go 1.16 版本开始,用于安装外部工具,避免修改项目 go.mod 文件。
  • list:列出当前包信息。
  • mod:用于管理模块。包括多个子命令,如 go mod tidygo mod download 等。
  • run:编译并运行程序。构建临时可执行文件,并输出程序执行结果。
  • test:测试源码包。自动识别源码目录下以 _test.go 结尾文件,并执行测试,展示结果。
  • tool:运行指定工具。
  • version:显示 Go 语言版本信息。
  • vet:检查源码错误。

内置工具可执行文件实际存放在 $GOROOT/pkg/tool/<platform> 目录下。可以通过使用 go help [命令] 来查看每个命令用法。

额外功能

这里指在标准库中同名,但是提供额外功能的包。基于用户反馈,这些功能可能最终会并入标准库。例如下面这些:

  • golang.org/x/net:提供额外网络协议、功能和工具,例如 WebSocket 协议。
  • golang.org/x/crypto:提供额外加密函数和加密算法,例如 SSH 协议实现。
  • golang.org/x/sync:提供额外同步原语,比如信号量。
  • golang.org/x/mobile:用于支持开发移动端应用程序。

额外工具

额外工具放在 golang.org/x/tools 下面,主要包括用于代码重构、静态分析、编辑器集成、性能分析等方面工具,很多已经集成到流行 IDE 中,例如下面这些:

  • goplsgopls 是一个语言服务器,支持 LSP(Language Server Protocol)。提供代码自动完成、定义跳转、符号搜索、重命名、格式化和诊断等强大功能,是 Go 代码编辑环境核心组件。
  • goimportsgoimportsgofmt 基础上增加自动维护导入包功能。
  • guruguru 是一个代码导航工具,用于查询 Go 代码结构,如查找符号定义、被引用位置、类型方法等。
  • godocgodoc 原本是内置工具,golang.org/x/tools 版本提供更多功能,如启动本地服务器查看文档等。
  • gorenamegorename 提供重命名变量、函数、类型等标识符功能,并确保代码库中所有引用同步更新。
  • benchcmp:用于比较和分析基准测试结果。
  • cover:提供测试覆盖率工具。

安装工具

安装二进制工具命令格式为:go install some/package@version ,可执行文件会被安装到 $GOPATH/bin$GOBIN 目录。安装版本可自由指定,要省事可一律指定为 @latest

例如安装 godoc

go install golang.org/x/tools/cmd/godoc@latest

安装完成后,可以通过命令行直接运行 godoc 命令。