Go 常用命令

记录 Go 配套的常用命令。

go build

编译

  • -mod=vendor build 时优先使用 vendor 中的依赖包

  • -race 增加 data race detector 功能,在程序执行过程中会分析共享变量和锁的执行过程,分析是否存在 data race,并生成报告以便定位问题。在运行时,如果发现 data race,则会输出WARNING: DATA RACE xxxx,同时输出涉及的携程的栈。

    • 所谓data race是指多个线程在未加锁的情况下对同一个变量赋值,有可能引发意外错误,比如进程退出、逻辑错乱,不会引发 panic,所以不易察觉。
  • 如果包名是main,执行go build时会自动找到并编译,会编译为二进制文件放在当前包内
  • 如果包名不是main,执行go build会找不到,需要执行go build xxx.go,会尝试编译,成功后丢弃编译出的二进制文件,如果想生成二进制文件需要用-o name执行二进制文件名

可以通过下面环境变量设置交叉编译选项:

1
2
3
4
5
// 示例,在 windows 下编译 mac 使用的可执行文件
SET CGO_ENABLED = 0
SET GOOS = darwin3
SET GOARCH = amd64
go build test.go

GOOS=linux GOARCH=amd64 go build main.go

  • CGO_ENABLED 是否启用 CGO,0 不启用; 1 启用;
  • GOOS 目标操作系统,windows linux darwin freebsd,其中 darwin 是 mac 的操作系统
  • GOARCH 目标操作系统架构,386 amd64 arm

在编译时写入版本号在运行时读出

  • 利用go build -ldflags="-X 'package_path.variable_name=new_value'" 在编译期覆盖指定变量
1
2
3
# build.sh
GIT_SHA=`git rev-parse HEAD || echo`  # 获取 git commit id
go build -ldflags "-X main.GitSHA=${GIT_SHA} ..."
package main

var GitSHA string // 这个变量将被覆盖

func main() {
	fmt.Println("gitSHA:", GitSHA)  // 输出 gitSHA: xxxxx
}
  • 注意,必须是变量,不能是常量,否则无法成功覆盖

go run

编译并运行

go run hello.go

go mod

go mod vendor 更新本工程的依赖库到本地 vendor 文件夹,不指定特定版本的外部包

go mod tidy 根据 go.mod 文件整理一下依赖关系,只变更 go.mod 和 go.sum 文件。

go install

编译指定的源码库并安装到 GOPATH/bin 目录下

go get

  • go install功能相同

  • 在 go mod 模式下,会自动更新到go.mod文件中的包依赖

go fmt

.go文件进行格式化处理

go vet

检查包中的错误

go tool

go tool compile -S main.go > main.s 将文件编译为汇编代码,以便查看