非零基础自学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语言的源码文件分为三大类:命令源码文件、库源码文件和测试源码文件。命令源码文件总是作为可执行的程序的入口,库源码文件一般用于集中放置各种待使用的程序实体,而测试源码文件主要用于对前两种源码文件中的程序实体的功能和性能进行测试。