go build
此命令默认每次都会重新编译除标准库以外的所有依赖包
参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -o | 可执行文件名(默认与目录同名) | |
| -a | 强制重新编译所有包(含标准库) | |
| -p | 并行编译所使用的CPU核数量 | |
| -v | 显示待编译包名字 | |
| -n | 仅显示编译命令,但不执行 | |
| -x | 显示正在执行的编译命令 | |
| -work | 显示临时工作目录,完成后不删除 | |
| -race | 启动数据竞争检查(仅支持amd64) | |
| -gcflags | 编译器参数 | |
| -ldflags | 连接器参数 |
gcflags
| 参数 | 说明 | 示例 |
|---|---|---|
| -B | 禁止越界检查 | |
| -N | 禁止优化 | |
| -l | 禁止内联优化 | |
| -u | 禁用unsafe | |
| -S | 输出汇编代码 | |
| -m | 输出优化信息 |
// 查看更多编译参数 go tool compile -h
ldflags
| 参数 | 说明 | 示例 |
|---|---|---|
| -s | 禁用符号表 | |
| -w | 禁用DRAWF调试信息 | |
| -X | 设置字符串全局变量 | -X ver="0.99" |
| -H | 设置可执行文件格式 | -H windowgui |
// 查看更多链接参数 go tool link -h
默认执行不带任何参数
会生成一个与目录同样名字的可执行文件
# 执行go build
ouyangjun@:~/go/src/script$go build
go: downloading github.com/go-resty/resty/v2 v2.3
go: downloading golang.org/x/net v0.0.0-20200513185701-a91f0712d120
# 查看当前目录下文件
ouyangjun@:~/go/src/script$ls
compress go.mod go.sum LICENSE log main.go performance README.md script
# 执行可执行文件
ouyangjun@:~/go/src/script$./script
0 n
data length = 1000000
V0 4.181462259s
go build -race
ouyangjun@:~/go/src/script$go build -race
go build: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64
调试时不进行 DWARF 的压缩(解决mac无法gdb载入问题)
go13 build -ldflags="-compressdwarf=false" .
go install
和build参数相同,但会将编译结果安装到bin/pkg目录; go install 支持增量编译,在没有修改的情况下,会直接链接pkg目录的静态包
go install -x
ouyangjun@:~/go/src/script$go install -x
WORK=/tmp/go-build995124150
...
mkdir -p /home/ouyangjun/go/bin/
mv $WORK/b001/exe/a.out /home/ouyangjun/go/bin/script
rm -r $WORK/b001/
可以看到最后将结果保存在gopath下的bin目录
go clean
清理工作目录,删除编译和安装遗留的目标文件
参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -n | 查看但不执行清理命令 | |
| -x | 查看并执行清理命令 | |
| -i | 删除bin、pkg目录下的二进制文件 | |
| -r | 清理所有依赖包临时文件(递归清理) |
go clean -i
清理go install 安装的文件
ouyangjun@:~/go/src/script$go clean -i -x
cd /home/ouyangjun/go/src/script
rm -f script script.exe script.test script.test.exe main main.exe
rm -f /home/ouyangjun/go/bin/script
ouyangjun@:~/go/src/script$ll
总用量 60
drwxrwxr-x 6 ouyangjun ouyangjun 4096 12月 9 08:14 ./
drwxrwxr-x 3 ouyangjun ouyangjun 4096 12月 9 08:06 ../
drwxrwxr-x 2 ouyangjun ouyangjun 4096 12月 9 08:06 compress/
-rw-rw-r-- 1 ouyangjun ouyangjun 432 12月 9 08:06 .editorconfig
drwxrwxr-x 8 ouyangjun ouyangjun 4096 12月 9 08:06 .git/
-rw-rw-r-- 1 ouyangjun ouyangjun 32 12月 9 08:06 .gitignore
-rw-rw-r-- 1 ouyangjun ouyangjun 86 12月 9 08:06 go.mod
-rw-rw-r-- 1 ouyangjun ouyangjun 868 12月 9 08:06 go.sum
-rw-rw-r-- 1 ouyangjun ouyangjun 11357 12月 9 08:06 LICENSE
drwxrwxr-x 2 ouyangjun ouyangjun 4096 12月 9 08:06 log/
-rw-rw-r-- 1 ouyangjun ouyangjun 549 12月 9 08:06 main.go
drwxrwxr-x 2 ouyangjun ouyangjun 4096 12月 9 08:06 performance/
-rw-rw-r-- 1 ouyangjun ouyangjun 22 12月 9 08:06 README.md
go clean -n
仅展示清理命令,但不执行
ouyangjun@:~/go/src/script$go clean -n
cd /home/ouyangjun/go/src/script
rm -f script script.exe script.test script.test.exe main main.exe
go run main.go
-race
// 竞争检查
go run -race main.go
-args
// 参数
go run main.go -args param1 param2
go get
下载并安装扩展包,默认保存到GOPATH指定的第一个工作空间;
参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -d | 仅下载,不执行安装命令 | |
| -t | 下载测试所需的依赖包 | |
| -u | 更新包,包括其依赖包 | |
| -v | 查看并执行命令 |
tool
pprof
// 分析CPU
go tool pprof -http :9991 V0_cpu.out
// 分析内存
go tool pprof -http :9991 V0_mem.out
trace
go tool trace V0_trace.out
objdump
反汇编可执行文件
usage: go tool objdump [-S] [-s symregexp]
binary [start end]
-S print go code alongside assembly
-s string
only dump symbols matching this regexp
$ go tool objdump -s "main\.\w+" script.exe
vet
vet是一个优雅的工具,它会做代码静态检查发现可能的bug或者可疑的构造。
go vet <directory|files>
使用案例
// code
bash-4.3# cat nocopy.go
package nocopy
type noCopy struct{}
func (*noCopy) Lock() {}
func (*noCopy) Unlock() {}
type UserInfo struct {
noCopy noCopy
Name string
Address string
}
type Person struct {
user UserInfo
}
// 测试用例
bash-4.3# go vet ./
# github.com/oyjjpp/script/nocopy
./nocopy_test.go:11:9: literal copies lock value from userinfo: github.com/oyjjpp/script/nocopy.UserInfo contains github.com/oyjjpp/script/nocopy.noCopy
./nocopy_test.go:13:14: call of log.Println copies lock value: github.com/oyjjpp/script/nocopy.Person contains github.com/oyjjpp/script/nocopy.UserInfo contains github.com/oyjjpp/script/nocopy.noCopy
list
列举某个仓库的所有版本
thompshon@thompshondeMacBook-Pro oa % go list -m -versions github.com/sirupsen/logrus
github.com/sirupsen/logrus v0.1.0 v0.1.1 v0.2.0 v0.3.0 v0.4.0 v0.4.1 v0.5.0 v0.5.1 v0.6.0 v0.6.1 v0.6.2 v0.6.3 v0.6.4 v0.6.5 v0.6.6 v0.7.0 v0.7.1 v0.7.2 v0.7.3 v0.8.0 v0.8.1 v0.8.2 v0.8.3 v0.8.4 v0.8.5 v0.8.6 v0.8.7 v0.9.0 v0.10.0 v0.11.0 v0.11.1 v0.11.2 v0.11.3 v0.11.4 v0.11.5 v1.0.0 v1.0.1 v1.0.3 v1.0.4 v1.0.5 v1.0.6 v1.1.0 v1.1.1 v1.2.0 v1.3.0 v1.4.0 v1.4.1 v1.4.2 v1.5.0 v1.6.0 v1.7.0 v1.7.1 v1.8.0 v1.8.1
thompshon@thompshondeMacBook-Pro oa %
正确识别将要使用的模块及其版本
thompshon@thompshondeMacBook-Pro oa % go list -m all | grep rpcx
github.com/rpcxio/go-redis v0.8.0
github.com/smallnest/rpcx v0.0.0-20201122012143-03def25179ab
mod
module 管理工具
graph
模块在项目中的关系
thompshon@thompshondeMacBook-Pro oa % go mod graph | grep rpcx
oa github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab github.com/ChimeraCoder/gojson@v1.1.0
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab github.com/abronan/valkeyrie@v0.1.0
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab github.com/aliyun/alibaba-cloud-sdk-go@v1.61.69
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab github.com/anacrolix/envpprof@v1.1.0
github.com/smallnest/rpcx@v0.0.0-20201122012143-03def25179ab github.com/anacrolix/sync@v0.2.0
why
go mod why github.com/bwmarrin/snowflake