🌝

go 命令行工具

Posted at — May 17, 2022

go build

go build 用于编译代码,生成可执行文件。如执行 go build ed.go 会生成 ed 或 ed.exe12

参数说明

-gcflags

编译器参数。一组传递给 go tool compile 的参数,可通过查 go tool compile 命令查到有哪些支持的参数3,如 -N 关闭编译器优化,-l 关闭内联(inlining):

1
2
3
go build -gcflags "-N -l" main.go
go build -gcflags="-N -l" main.go
go build -gcflags=-N -gcflags=-l main.go

-ldflags

链接器参数。一组传递给 go tool link 的参数4,如 -X importpath.name=value 设置包内指定变量的值,该变量可以是未赋值或初始化了的:

1
2
3
4
5
6
7
package main

var version = "1.0"

func main() {
	println(version)
}
1
2
3
$ go build -ldflags="-X main.version=2.0" main.go
$ ./main
2.0

-tags

一组逗号(,)隔开的标签,与标签匹配的源码才会被编译。

1
2
3
4
5
6
//go:build prod
package main

func main() {
	println("test")
}

只有带上正确的 tag 才会编译以上代码。

1
go build -tags=prod .

-o

指定输出地址

go install

go install 编译并安装可执行文件到 $GOPATH/bin 或 $HOME/go/bin 目录下,和 go build 有一样的参数5

1
go install [build flags] [packages]

go generate

go generate 识别代码中的 //go:generate command argument... 指令来执行特定操作。

1
2
//go:generate echo "this is a test."
package mypkg

执行 go generate mypkg.go 会打印 “this is a test."。

go vet

go vet 检查代码并报告可疑错误。通过 go doc cmd/vet 可以查看支持的命令。

1
2
3
4
5
package main

func main() {
	printf("test")
}
1
2
3
$ go vet .
# awesomeProject
vet: ./main.go:4:3: undeclared name: prinf

go list

go list 逐行列出包名。

用法

1
go list [-f format] [-json] [-m] [list flags] [build flags] [packages]

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ tree .
.
├── gen
│   ├── a
│   │   └── a.go
│   ├── b
│   │   └── b.go
│   └── gen.go
└── main.go

$ go list ./...
awesomeProject
awesomeProject/gen
awesomeProject/gen/a
awesomeProject/gen/b

go 命令行工具中,(…)表示通配符,比如 net/... 同时匹配 net 包和 net/http6

另外,(.)以及(..)分别表示当前目录和上一级目录:

1
2
3
4
5
6
7
$ go list go list ./gen/a/../...
awesomeProject/gen

$ go list ./gen/a/../... 
awesomeProject/gen
awesomeProject/gen/a
awesomeProject/gen/b

多个 go 命令行工具可以组合使用:

1
2
3
$ go vet $(go list ./...)
# awesomeProject/gen/a
vet: gen/a/a.go:4:2: undeclared name: printf

参数说明

-m

打印模块名,而不是包名。all 是特殊用法,表示所有在使用模块。

1
2
3
4
5
6
7
$ go list -m all
awesomeProject
cloud.google.com/go v0.26.0
github.com/BurntSushi/toml v0.3.1
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46
github.com/PuerkitoBio/purell v1.1.1
...

-json

使用 json 格式打印

-u

提示可升级信息

1
2
3
4
5
6
$ go list -m -u all
k8s.io/api v0.21.0 [v0.24.0]
k8s.io/apimachinery v0.21.0 [v0.24.0]
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac [v0.0.0-20220307231824-4627b89bbf1b]
k8s.io/klog/v2 v2.8.0 [v2.60.1]
...

go get

go get 命令会添加依赖包到 module,下载包并更新到 go.mod。

1
2
go get example.com/pkg
go get example.com/pkg@v1.2.3

godoc

godoc 用于生成 Go 文档。

安装方式:go get -v golang.org/x/tools/cmd/godoc

用法

显示文档的 web 版:godoc -http=:6060

以下是在代码中写文档,可以为包、函数、结构体写文档。type, const, func 以名称为注释的开头, package 以 Package name 为注释的开头7

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// ----- math/math.go -----

// Package math 包含四则运算函数
package math

// Config 配置信息
type Config struct {
	ID   string
	Base int
}

// Add 求两数和
func Add(x, y int) int {
	return x + y
}

go-commands-1.png

为函数写示例的规范如下,首先在文件同一目录下创建 example_xxx_test.go文件,包名命名为 xxx_test

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// ----- math/example_math_test.go -----

package math_test

import "awesomeProject/math"

// 示例放置在 Overview 下
func Example_add() {
	num := math.Add(1, 3)
	print(num)
	// Output:
	// 4
}

// 示例放置在函数下
func ExampleAdd() {
	num := math.Add(1, 3)
	print(num)
	// Output:
	// 4
}

go-commands-2.png

go-commands-3.png