Go 常用命令

参数 说明
-o 指定输出可执行文件名
-v 编译时显示包名,可以理解成输出详细编译信息
-u 不加-u标记,执行 go get 一个已有的代码包,会发现命令什么都不执行。加了-u才会去拉取最新的代码包的最新版本
-race 开启竞态检测
*.go 编译当前目录下的所有go文件,也可以写成 f2.go f2.go …
-a 该选项用于强制重新编译所有的依赖项,即使它们似乎是最新的或未更改。这对于确保所有依赖项都与最新的代码一致非常有用。使用 -a 标志可以防止使用缓存的依赖项,从而确保每个依赖项都会被重新编译,并与最新的代码进行链接。
-w 该选项用于禁用链接器产生的警告信息。当构建可执行文件时,链接器通常会生成一些警告,例如未使用的变量或未导出的符号等。使用 -w 标志可以禁用这些警告信息,以减小可执行文件的大小。
-s -s 参数会告诉链接器在构建可执行文件时不生成符号表和调试信息。符号表包含了源代码中的符号(如变量名、函数名等)和对应的地址信息,而调试信息则包含了用于调试程序的相关信息(如源代码文件路径、行号等)。
禁用符号表和调试信息的生成可以减小最终生成的可执行文件的大小,同时也可以增强代码的安全性,因为这些信息对于攻击者来说可能是有价值的。
-X 设置包中的变量值
-gcflags "-N -l" -N:该标志告诉编译器不进行优化。优化是编译器对代码进行的一系列转换和重组,旨在提高代码的执行效率。通过禁用优化,可执行文件的生成将更符合源代码的结构,便于调试。
-l:该标志告诉编译器禁用内联优化。内联优化是编译器将函数调用替换为函数体内容的一种优化技术,可以减少函数调用的开销。禁用内联优化可以确保函数调用保持不变,使得调试过程中可以精确地跟踪函数的执行。
这两个标志的组合 -gcflags "-N -l" 一起使用,可以在构建过程中禁用优化和内联优化,从而产生更容易调试的可执行文件。
-ldflags 给 go 链接器传入参数,实际是给 go tool link 的参数,可以用 go tool link --help 查看可用的参数。
-ldflags '-extldflags "-static"' 静态编译。告诉链接器在构建可执行文件时使用静态链接。静态链接意味着将所有的依赖项(包括系统库)都包含在最终的可执行文件中,以便在其他系统上运行时不需要依赖外部的库。
参数 说明
GOOS GOARCH
linux 386 / amd64 / arm
darwin 386 / amd64
feedbsd 386 / amd64
windows 386 / amd64

对于编译给 ARM 使用的 Go 程序,需要根据实际情况配置$GOARM,这是用来控制 CPU 的浮点协处理器的参数。

$GOARM默认是 6,对于不支持 VFP 使用软件运算的老版本 ARM 平台要设置成 5,支持 VFPv1 的设置成 6,支持 VFPv3 的设置成 7。

示例:

1
GOARM=7 GOARCH=arm GOOS=linux go build -v -o fca

当谈到 Go 语言的模块化管理时,Go Module(go mod)是一个重要的工具和概念。

历史:

  • Go 1.11(2018年8月发布)引入了 Go Module 的原始支持。它提供了对版本化模块的支持,以解决 Go 语言包管理的问题。

  • Go 1.13(2019年9月发布)对 Go Module 进行了一些改进,增强了对代理和私有模块的支持,并提供了更好的性能和可靠性。

  • 从 Go 1.14(2020年2月发布)开始,Go Module 成为 Go 语言默认的包管理工具,取代了之前的 GOPATH 模式。

为什么需要 Go Module:

  • 版本管理:Go Module 允许开发者明确指定项目所使用的依赖项的版本,以便在不同的开发环境中获得一致的构建结果。

  • 模块隔离:每个模块都有自己的依赖关系,使得不同的项目可以使用不同版本的依赖项,而不会相互干扰。

  • 更好的包管理:Go Module 管理包的方式更加灵活、简单,可以自动解析和下载依赖项,使得包的导入和更新更加方便。

常见使用命令:

  • go mod init <module>:初始化一个新的模块,可以指定模块的名称。

  • go mod tidy:根据项目的源码文件,自动分析并更新模块的依赖关系,移除不再使用的依赖项。

  • go mod vendor:将依赖项复制到项目的 vendor 目录下,以便离线使用或与版本控制系统一起管理。

  • go mod download:下载模块的依赖项到本地缓存,以便离线使用。

  • go mod graph:显示模块的依赖关系图。

  • go mod edit:编辑模块的 go.mod 文件,可以添加、更新或移除依赖项。

  • go mod verify:验证模块的依赖项,确保其完整性和正确性。

  • go mod list:列出项目的所有依赖项及其版本。

  • go mod why <module>:解释为什么需要特定的依赖项。

  • go mod graph:显示模块的依赖关系图,以图形方式展示模块之间的依赖关系。

  • go mod edit -require <module>@<version>:手动添加或更新依赖项的版本,可以使用特定的模块和版本号。

  • go mod edit -replace <module>=<replacement>@<version>:用其他模块替代指定的依赖项,用于本地开发或测试。

  • go mod tidy -v:以详细模式运行 go mod tidy 命令,显示操作的详细信息。

  • go mod download -x:以详细模式运行 go mod download 命令,显示下载过程中的详细信息。

  • go mod vendor -v:以详细模式运行 go mod vendor 命令,显示复制依赖项到 vendor 目录的详细信息。

  • go mod why -m <module>:显示特定模块为什么被包含在模块图中,解释模块之间的直接和间接依赖关系。

  • go mod why -u:检查可升级的依赖项,解释为什么某个依赖项需要更新到更高版本。