Golang常用工具分享

2022-07-19 11:52:06 浏览数 (1)

本文主要分享Golang相关的一些使用工具,简单介工具作用和使用场景,不会详细介绍其使用,列举的工具也不是最全的,具体可以参考链接或自行搜索学习。

Go官方的工具可以使用go help xxx命令查看帮助文档,比如查看go get的参数标记和使用文档:

代码语言:text复制
go help get

 可以参考Golang官方的文档:https://golang.google.cn/cmd/go/

1. Go官方工具

1.1 go get

该命令可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,下载后自动编译,一般引用依赖用go get就可以了。

参考:

代码语言:text复制
go get -u "github.com/VictoriaMetrics/fastcache"

https://www.kancloud.cn/cattong/go_command_tutorial/261349

1.2 go build

该命令用于编译我们指定的源码文件或代码包以及它们的依赖包。命令的常用标记说明如下:

标记名称

标记描述

-a

强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。

-n

打印编译期间所用到的其它命令,但是并不真正执行它们。

-p n

指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1。

-race

开启竞态条件的检测。不过此标记目前仅在linux/amd64、freebsd/amd64、darwin/amd64和windows/amd64平台下受到支持。

-v

打印出那些被编译的代码包的名字。

-work

打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。

-x

打印编译期间所用到的其它命令。注意它与-n标记的区别。

编译过程输出到文件:go build -x > result 2>&1,因为go build -x 最终是将日志写到标准错误流当中。

如果只在编译特定包时需要指定参数,可以参考包名=参数列表的格式,比如go build -gcflags='log=-N -l' main.go

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261347

1.3 go install

该命令用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与go build命令一样,传给go install命令的代码包参数应该以导入路径的形式提供。

并且,go build命令的绝大多数标记也都可以用于go install命令。实际上,go install命令只比go build命令多做了一件事,即:安装编译后的结果文件到指定目录。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261348

1.4 go fmt和gofmt

Golang的开发团队制定了统一的官方代码风格,并且推出了gofmt工具(gofmt或go fmt)来帮助开发者格式化他们的代码到统一的风格。

gofmt是一个cli程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有.go文件,如果不传参数,会格式化当前目录下的所有.go文件。

gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能

gofmt是一个独立的cli程序,而go中还有一个go fmt命令,go fmt命令是gofmt的简单封装。go fmt在调用gofmt时添加了-l -w参数,相当于执行了gofmt -l -w

参考:https://blog.csdn.net/whatday/article/details/97682094

1.5 go env

该命令用于打印Go语言的环境信息,常见的通用环境信息如下:

名称

说明

CGO_ENABLED

指明cgo工具是否可用的标识。

GOARCH

程序构建环境的目标计算架构。

GOBIN

存放可执行文件的目录的绝对路径。

GOCHAR

程序构建环境的目标计算架构的单字符标识。

GOEXE

可执行文件的后缀。

GOHOSTARCH

程序运行环境的目标计算架构。

GOOS

程序构建环境的目标操作系统。

GOHOSTOS

程序运行环境的目标操作系统。

GOPATH

工作区目录的绝对路径。

GORACE

用于数据竞争检测的相关选项。

GOROOT

Go语言的安装目录的绝对路径。

GOTOOLDIR

Go工具目录的绝对路径。

GORPOXY

设置拉取依赖的代理

GOSUMDB

全称为 Go CheckSum Database,用来校验下载的包的安全性问题

设置或修改环境变量值:

代码语言:text复制
go env -w GOPROXY="https://goproxy.com,direct"

 参考:https://www.kancloud.cn/cattong/go_command_tutorial/261359

1.6 go run 

该命令可以运行命令源码文件,只能接受一个命令源码文件以及若干个库源码文件(必须同属于main包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么go run命令就只会打印错误提示信息并退出,而不会继续执行。

在通过参数检查后,go run命令会将编译参数中的命令源码文件,并把编译后的可执行文件存放到临时工作目录中。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261352

1.7 go test

该命令用于对Go语言编写的程序进行测试,这种测试是以代码包为单位的,命令会自动测试每一个指定的代码包。当然,前提是指定的代码包中存在测试源码文件。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261353

1.8 go clean

该命令会删除掉执行其它命令时产生的一些文件和目录。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261350

1.9 go list

该命令的作用是列出指定的代码包的信息。与其他命令相同,我们需要以代码包导入路径的方式给定代码包。被给定的代码包可以有多个。这些代码包对应的目录中必须直接保存有Go语言源码文件,其子目录中的文件不算在内。

标记-e的作用是以容错模式加载和分析指定的代码包。在这种情况下,命令程序如果在加载或分析的过程中遇到错误只会在内部记录一下,而不会直接把错误信息打印出来。

为了看到错误信息可以使用-json标记。这个标记的作用是把代码包的结构体实例用JSON的样式打印出来。-m标记可以打印出modules而不是package。

代码语言:javascript复制
# cd yky-sys-backend/cmd/bidengine
# go list -json -m
{
        "Path": "github.com/Project/test",
        "Main": true,
        "Dir": "/data/test",
        "GoMod": "/data/test/go.mod",
        "GoVersion": "1.15"
}
 
# 进入到.go文件的目录下,可以把文件依赖打印出来
go list -m -json

 参考:https://www.kancloud.cn/cattong/go_command_tutorial/261354

1.10 go mod xxx

1.10.1 go mod init

该命令初始化并写入一个新的go.mod至当前目录中,实际上是创建一个以当前目录为根的新模块。文件go.mod必须不存在。如果可能,init会从import注释(参阅“go help importpath”)或从版本控制配置猜测模块路径。要覆盖此猜测,提供模块路径作为参数 module为当前项目名。比如:

代码语言:javascript复制
go mod init demo

 参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.2 go mod tidy

该命令确保go.mod与模块中的源代码一致。它添加构建当前模块的包和依赖所必须的任何缺少的模块,删除不提供任何有价值的包的未使用的模块。它也会添加任何缺少的条目至go.mod并删除任何不需要的条目。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.3 go mod vendor

该命令重置主模块的vendor目录,使其包含构建和测试所有主模块的包所需要的所有包。不包括vendor中的包的测试代码。即将GOPATH或GOROOT下载的包拷贝到项目下的vendor目录,如果不使用vendor隔离项目的依赖,则不需要使用该命令拷贝依赖。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.4 go mod download

该命令下载指定名字的模块,可为选择主模块依赖的模块匹配模式,或path@version形式的模块查询。如果download不带参数则代表是主模块的所有依赖。download的只会下载依赖,不会编译依赖,和get是有区别的。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.5 go mod edit

该命令提供一个编辑go.mod的命令行接口,主要提供给工具或脚本使用。它只读取go.mod;不查找涉及模块的信息。默认情况下,edit读写主模块的go.mod文件,但也可以在标志后指定不同的目标文件。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.6 go mod graph

该命令以文本形式打印模块间的依赖关系图。输出的每一行行有两个字段(通过空格分割);模块和其所有依赖中的一个。每个模块都被标记为path@version形式的字符串(除了主模块,因其没有@version后缀)。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.7 go mod verify

该命令查存储在本地下载源代码缓存中的当前模块的依赖,是否自从下载之后未被修改。如果所有模块都未被修改,打印“all modules verified”。否则,报告哪个模块已经被修改并令“go mod”以非0状态退出。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.10.8 go mod why

该命令输出每个包或者模块的引用块,每个块以注释行“# package”或“# module”开头,给出目标包或模块。随后的行通过导入图给出路径,一个包一行。每个块之间通过一个空行分割,如果包或模块没有被主模块引用,该小节将显示单独一个带圆括号的提示信息来表明该事实。

参考:https://www.jianshu.com/p/f6d2d6db2bca

1.11 go tool xxx

go tool的可执行文件在GOROOT或GOPATH的pkg/tool目录。go doc cmd可以查看具体cmd的使用说明,比如

代码语言:javascript复制
go doc pprof

1.11.1 go tool pprof

在Golang中,可以通过pprof工具对应于程序的运行时进行性能分析,包括CPU、内存、Goroutine等实时信息。

参考:

  • https://www.kancloud.cn/cattong/go_command_tutorial/261357

1.11.2 go tool trace

该命令可以追踪请求链路,清晰的了解整个程序的调用栈,可以通过追踪器捕获大量信息。

参考:

  • https://zhuanlan.zhihu.com/p/410590497

1.11.3 go tool compile

该命令可以编译Go文件生成汇编代码,-N参数表示禁止编译优化, -l表示禁止内联,-S表示打印汇编,比如

代码语言:javascript复制
# 会生成main.o的汇编文件
go tool compile -S main.go

1.11.4 go tool vet和go vet

该命令是一个用于检查Go语言源码中静态错误的简单工具。

go vet命令是go tool vet命令的简单封装。它会首先载入和分析指定的代码包,并把指定代码包中的所有Go语言源码文件和以“.s”结尾的文件的相对路径作为参数传递给go tool vet命令。其中,以“.s”结尾的文件是汇编语言的源码文件。如果go vet命令的参数是Go语言源码文件的路径,则会直接将这些参数传递给go tool vet命令。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261356

1.11.5 go tool doc和go doc

该命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。

所谓Go语言的程序实体,是指变量、常量、函数、结构体以及接口。而程序实体的标识符即是代表它们的名称。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261351

1.11.6 go tool addr2line

该命令可以调用栈的地址转化为文件和行号。

代码语言:javascript复制
Usage:
 
    go tool addr2line binary
 
Addr2line reads hexadecimal addresses, one per line and with optional 0x
prefix, from standard input. For each input address, addr2line prints two
output lines, first the name of the function containing the address and
second the file:line of the source code corresponding to that address.
 
This tool is intended for use only by pprof; its interface may change or it
may be deleted entirely in future releases.

1.11.7 go tool asm

该命令可以将汇编文件编译成一个.o文件,后续这个.o文件可以用于生成.a归档文件,命令的file参数必须是汇编文件。

代码语言:javascript复制
Usage:
 
    go tool asm [flags] file
 
The specified file must be a Go assembly file. The same assembler is used
for all target operating systems and architectures. The GOOS and GOARCH
environment variables set the desired target.

1.11.8 go tool buildid

每一个 Go 二进制文件内,都有一个独一无二的 Build ID,详情参考 src/cmd/go/internal/work/buildid.go 。Go Build ID 可以用以下命令来查看:

代码语言:javascript复制
go tool buildid

 参考:https://www.anquanke.com/post/id/215419

1.11.9 go tool cgo

该命令可以使我们创建能够调用C语言代码的Go语言源码文件。这使得我们可以使用Go语言代码去封装一些C语言的代码库,并提供给Go语言代码或项目使用。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261358

1.11.10 go tool cover

该命令对单元测试过程中生成的代码覆盖率统计生成html文件,可以本地打开展示。

代码语言:javascript复制
go test -coverprofile=a.out
go tool cover -html=a.out -o coverage.html

 覆盖度工具不仅可以记录分支是否被执行,还可以记录分支被执行了多少次。

go test -covermode=set|count|atomic: -covermode:

  • set: 默认模式,统计是否执行 count: 计数 atomic: count的并发安全版本,仅当需要精确统计时使用

通过go tool cover -func=count.out查看每个函数的覆盖度。

参考:https://blog.csdn.net/xhdxhdxhd/article/details/120424848

1.11.11 go tool dist

dist工具是属于go的一个引导工具,它负责构建C程序(如Go编译器)和Go工具的初始引导副本。它也可以作为一个包罗万象用shell脚本替换以前完成的零工。通过“go tool dist”命令可以操作该工具。

代码语言:javascript复制
go tool dist
usage: go tool dist [command]
Commands are:
 
banner         print installation banner
bootstrap      rebuild everything
clean          deletes all built files
env [-p]       print environment (-p: include $PATH)
install [dir]  install individual directory
list [-json]   list all supported platforms
test [-h]      run Go test(s)
version        print Go version

 使用go tool dist list可以输出当前安装 Go 版本所支持的操作系统与架构。

参考:https://blog.csdn.net/byxiaoyuonly/article/details/112492264

1.11.12 go tool fix和go fix

该命令会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法等等。

这个工具其实非常有用。在编程语言的升级和演进的过程中,难免会对过时的和不够优秀的语法及标准库进行改进。

参考:https://www.kancloud.cn/cattong/go_command_tutorial/261355

1.11.13 go tool link

该命令链接Go的归档文件比如静态库,以及链接其所有依赖,生成一个可执行文件(含main package)。

代码语言:javascript复制
go tool link [flags] main.a
Flags:
 
    -B note
        Add an ELF_NT_GNU_BUILD_ID note when using ELF.
        The value should start with 0x and be an even number of hex digits.
    -D address
        Set data segment address.
    -E entry
        Set entry symbol name.
    -H type
        Set executable format type.
        The default format is inferred from GOOS and GOARCH.
        On Windows, -H windowsgui writes a "GUI binary" instead of a "console binary."
    -I interpreter
        Set the ELF dynamic linker to use.
    -L dir1 -L dir2
        Search for imported packages in dir1, dir2, etc,
        after consulting $GOROOT/pkg/$GOOS_$GOARCH.
    -R quantum
        Set address rounding quantum.
    -T address
        Set text segment address.
    -V
        Print linker version and exit.
 
go tool compile -o calc.o -I pkg/linux_amd64 src/calc/calc.go
go tool link -o bin/calc -L pkg/linux_amd64 calc.o

 参考:http://cache.baiducontent.com/

1.11.14 go tool nm

该命令可以查看符号表的命令,等同于系统的 nm 命令,非常有用。在断点的时候,如果你不知道断点的函数符号,那么用这个命令查一下就知道了(命令处理的是二进制程序文件),第一列是地址,第二列是类型,第三列是符号。等同于nm命令。

参考:https://studygolang.com/articles/29906

1.11.15 go tool objdump

该命令可以反汇编二进制的工具,等同于系统objdump,命令解析的是二进制格式的程序文件。

代码语言:javascript复制
go tool objdump example.o
go tool objdump -s DoFunc example.o  // 反汇编具体函数

 参考:https://studygolang.com/articles/29906

1.11.16 go tool pack

该命令把二进制文件打包成静态库。

代码语言:javascript复制
go tool pack op file.a [name...]
 
参数op
    c   append files (from the file system) to a new archive
    p   print files from the archive
    r   append files (from the file system) to the archive
    t   list files from the archive
    x   extract files from the archive
 
go tool compile -o simplemath.o src/simplemath/add.go src/simplemath/sqrt.go
go tool pack c pkg/linux_amd64/simplemath.a simplemath.o

 参考:http://cache.baiducontent.com/

1.11.17 go tool test2json

该命令用于把测试可执行文件转化可读的json格式。

代码语言:javascript复制
// 生成测试文件的可执行文件
go  test string_concat_test.go -o string_concat.test
 
go tool test2json ./string_concat.test -test.v
 
// 输出
{"Action":"output","Output":"testing: warning: no tests to runn"}
{"Action":"output","Output":"PASSn"}
{"Action":"pass"}

 参考:https://blog.csdn.net/weixin_33772442/article/details/112098085

1.12 godoc

该命令可以生成一个Go官方文档的本地http服务,可以在线查看标准库和第三方库文档,以及项目文档,但是需要按照一定的格式去写注释。

代码语言:javascript复制
// 安装godoc
go get -v  golang.org/x/tools/cmd/godoc
 
// 方式一
godoc -http=:6060
 
// 方式二 : -play可以使用playground运行Example代码
godoc -http=:6060 -play
 
// 查看自己的项目文档,需要将其它路径下的项目代码目录建一个软链到GOROOT的src目录下,如cd $GOROOT/src; ln -s /data/my-project ./,在浏览器后面输入项目名即可
http://127.0.0.1:6060/pkg/my-project/

Web页面如下:

参考:https://www.fujieace.com/golang/godoc.html

2.  第三方工具

Go工具和组件汇总项目:

https://github.com/avelino/awesome-go

2.1 delve

本地代码调试工具

参考:https://github.com/go-delve/delve

2.2 goconvey

goconvey是一款针对Golang的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。

参考:https://github.com/smartystreets/goconvey

2.3 goleak

本地排查内存泄露的工具

参考:https://github.com/uber-go/goleak

2.4 go-wrk

Go接口压测工具

参考:https://github.com/adjust/go-wrk

2.5 golint

代码风格检查

参考:https://github.com/golang/lint

2.6 revive

代码风格检查,比golint速度更快

参考:https://github.com/mgechev/revive

2.7 gocode

代码自动补全工具,可以在vim中使用

参考:https://github.com/nsf/gocode

2.8 godoctor

代码重构工具

参考:https://github.com/godoctor/godoctor

2.9 gops

查看go进程和相关信息的工具,用于诊断线上服务。

https://github.com/google/gops

2.10 goreplay

GoReplay 是一个开源网络监控工具,可以将实时 HTTP 流量捕获并重放到测试环境。

参考:

https://github.com/buger/goreplay

https://blog.51cto.com/axzxs/5102596

2.11 depth

一个有用的Golang工具,Depth可帮助Web开发人员检索和可视化Go源代码依赖关系树。它可以用作独立的命令行应用程序或作为项目中的特定包。你可以通过在解析之前在Tree上设置相应的标志来添加自定义。

参考:https://github.com/KyleBanks/depth

2.12 go-swagger

该工具包包括各种功能和功能。Go-Swagger是Swagger 2.0的一个实现,可以序列化和反序列化swagger规范。它是RESTful API简约但强大的代表。

通过Go-Swagger,你可以swagger规范文档,验证JSON模式以及其他额外的规则。其他功能包括代码生成,基于swagger规范的API生成,基于代码的规范文档生成,扩展了的字符串格式,等等。

参考:https://github.com/go-swagger/go-swagger

2.13 gox

交叉编译工具,可以并行编译多个平台。

参考:https://github.com/mitchellh/gox

2.14 gocyclo

gocyclo 用来检查函数的复杂度。

代码语言:javascript复制
# 列出了所有复杂度大于20的函数
gocyclo -over 20 $(ls -d */ | grep -v vendor)

# 列出最复杂的5个
gocyclo -top 5 $(ls -d */ | grep -v vendor)

 参考:https://github.com/fzipp/gocyclo

2.15 deadcode

deadcode会告诉你哪些代码片段根本没用。

代码语言:javascript复制
find . -type d -not -path "./vendor/*" | xargs deadcode

 参考:https://github.com/tsenart/deadcode

2.16 gotype

gotype会对go文件和包进行语义(semantic)和句法(syntactic)的分析,这是google提供的一个工具。

代码语言:javascript复制
find . -name "*.go" -not -path "./vendor/*" -not -path ".git/*" -print | xargs gotype -a

参考:https://golang.org/x/tools/cmd/gotype

2.17 misspell

misspell用来拼写检查,对国内英语不太熟练的同学很有帮助。

代码语言:javascript复制
find . -type f -not -path "./vendor/*" -print | xargs misspell

 参考:https://github.com/client9/misspell

2.18 staticcheck

staticcheck是一个超牛的工具,提供了巨多的静态检查,就像 C#生态圈的 ReSharper 一样。

代码语言:javascript复制
# 安装:
go install honnef.co/go/tools/cmd/staticcheck@latest
# 使用:
staticcheck main.go

 参考:

https://staticcheck.io/docs/

https://github.com/dominikh/go-tools/tree/master/staticcheck

2.19 goconst

goconst 会查找重复的字符串,这些字符串可以抽取成常量。

代码语言:javascript复制
goconst ./… | grep -v vendor

参考:https://github.com/jgautheron/goconst

3. 参考

Go命令教程:https://www.kancloud.cn/cattong/go_command_tutorial/261351

Golang指南:顶级Golang框架、IDE和工具列表:https://zhuanlan.zhihu.com/p/30432648

Go代码检修工具集:http://t.zoukankan.com/binHome-p-14149941.html

0 人点赞