Golang—工具

487 阅读3分钟

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 129 08:14 ./
drwxrwxr-x 3 ouyangjun ouyangjun  4096 129 08:06 ../
drwxrwxr-x 2 ouyangjun ouyangjun  4096 129 08:06 compress/
-rw-rw-r-- 1 ouyangjun ouyangjun   432 129 08:06 .editorconfig
drwxrwxr-x 8 ouyangjun ouyangjun  4096 129 08:06 .git/
-rw-rw-r-- 1 ouyangjun ouyangjun    32 129 08:06 .gitignore
-rw-rw-r-- 1 ouyangjun ouyangjun    86 129 08:06 go.mod
-rw-rw-r-- 1 ouyangjun ouyangjun   868 129 08:06 go.sum
-rw-rw-r-- 1 ouyangjun ouyangjun 11357 129 08:06 LICENSE
drwxrwxr-x 2 ouyangjun ouyangjun  4096 129 08:06 log/
-rw-rw-r-- 1 ouyangjun ouyangjun   549 129 08:06 main.go
drwxrwxr-x 2 ouyangjun ouyangjun  4096 129 08:06 performance/
-rw-rw-r-- 1 ouyangjun ouyangjun    22 129 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