非零基础自学Golang
第15章 Go命令行工具
Go语言的工具箱提供了很多常用工具。
它可以被看作是特殊包管理器,用于包的查询、计算包的依赖关系、从远程版本控制系统下载包等任务。它也是一个构建系统,计算文件的依赖关系,然后调用编译器、汇编器和连接器构建程序。它还是一个单元测试、基准测试和性能测试的驱动程序,可让我们非常方便地进行各类代码测试,快速查找各类问题。
下面会详细介绍Go语言工具箱的具体功能,包括获取源码、编译、注释文档、测试、性能分析、源码格式化等。
运行go或go help命令查看内置的帮助文档,为了方便查看,我们列出了最常用的命令:
部分介绍:
build 编译打包依赖
clean 清理链接和缓存文件
doc 展示包的文档
env 打印Go环境变量信息
bug 启动Go语言调试
fix 更新文档语法
fmt 格式化文档结构
generate 通过扫描Go源码中的特殊注释来识别要运行的常规命令
get 下载安装包和依赖项
install 编译安装包和依赖项
list 查询包
run 编译运行Go程序
test 测试包
tool 运行Go的其他工具
version 打印版本号
vet 静态错误检查工具
15.1 编译相关指令
在之前的学习中,我们最熟悉的Go命令行工具就是go build和go run,现在我们来系统性地学习这两个工具的使用。
相较于Java和C++的编译速度,Go语言的快速编译是一个主要的效率优势。
15.1.1 build
go build指令用于编译我们的源码文件、代码包以及它们的依赖包。
我们创建相互引用的两个文件lib.go和main.go,分别对应动手写15.1.1和动手写15.1.2,两个文件同属于main包,将其放在GOPATH下的main目录,如C:\Users\DingJiaxiong\go\src\main。
package main
import "fmt"
func LibFunc() {
fmt.Println("This file is 15.1.1.go")
}
package main
import "fmt"
func main() {
LibFunc()
fmt.Println("This file is 15.1.2.go")
}
接下来,我们将试图编译这两个文件。go build支持三种编译方式。
【1】go build( 无参编译)
如果我们在执行go build命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包。
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
其实可以看到我们 直接编译的话,以前的版本 倒没事,后来有了 mod 的版本就不能直接 构建了
这里 有一种最直接的办法,它不是想要一个 go.mod 我们直接给他一个
go mod init
OK,现在就有了
再次构建
没报错则 说明 构建完成
出现了一个 亲生的 可执行文件
直接执行
没毛病
【2】go build + 文件列表
C:\Users\admin\go\src\main>go build -o main.exe lib.go main.go
使用这种方式编译时,作为参数的多个Go源码文件必须在同一个目录中。
先把之前 那个 干掉
用这个 方式再来一次
再次执行
没毛病
【3】go build + 包
C:\Users\admin\go\src\main>go build main
使用“go build+包”的方式编译需要将编译的包放到GOPATH下,否则编译器会找不到你想要编译的包。
再试一次
没毛病
Go语言有个不足的地方是,简单的几行代码使用go build命令编译出来大小会达到2~3 MB。
如何能减小可执行文件的体积呢?
go build命令后面加上编译参数-ldflags "-s -w"就可以减小体积。
其中-s的作用是去掉符号信息,在程序panic时的stack trace就没有任何文件名/行号信息了;-w是去掉DWARF调试信息,而后得到的程序就不能用gdb调试了。
C:\Users\admin\go\src\main>go build -ldflags "-s -w"
试试
构建成功,看看大小
确实小了很多
使用这个参数后,可以看见程序体积减小了40%左右。
当然,如果你觉得体积仍然较大,可以使用第三方工具对Go程序进行压缩处理,如UPX压缩。
UPX程序下载网址:https://github.com/upx/upx/releases。
下这个 吧
等待下载完成
解压
直接就是 一个 可执行文件,添加环境变量试试
保存
试试
OK,可以用了
C:\Users\admin\go\src\main>upx -9 main.exe
这里直接用 Goland 中的命令不知道为啥成功,在外面切进去就成功了
看看现在的大小
妙啊
upx -9参数表使用压缩效果最好的算法进行压缩,可以看到现在的程序体积已经是最开始的20%左右,只有500 KB左右。
go build还支持如下的附加参数。
-v 编译时显示包名
-a 强制重新构建
-n 打印输出编译时所用到的命令,但不真正执行
-x 打印输出编译时所用到的命令
-race 开启竞态检测
【提示】
Go语言的源码文件分为三大类:命令源码文件、库源码文件和测试源码文件。命令源码文件总是作为可执行的程序的入口,库源码文件一般用于集中放置各种待使用的程序实体,而测试源码文件主要用于对前两种源码文件中的程序实体的功能和性能进行测试。