1、go build
1.1 -x -v :让构建过程一目了然
go build添加-x -v选项,可以输出构建的执行细节。-v用于输出当前正在编译的包,而-x则用于输出go build执行的每一个命令。
1.2 -race:让并发bug无处遁形
-race命令行选项可以在构建时开启竞态检查。在程序运行时,如果发现对数据的并发竞态访问,就会给出警告。
测试代码如下:
package main
import (
"sync"
)
func main() {
m := map[int]int{}
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 20; i++ {
go func(n int) {
m[n] = n
wg.Done()
}(i)
}
wg.Wait()
}
使用-race选项编译,运行结果如下:
1.3 -gcflags:传递给编译器的标志选项集合
go build实质上是通过调用go自带的compile工具对go代码进行编译的。在linux下的位置为$GOROOT/pkg/tool/linux_amd64/compile。go build可以经过-gcflags向compile工具传递编译所需的命令标志选项集合。
go build采用下面的模式将标志选项列表传递给go编译器:
go build -gcflags='空格分割的标志选项列表'
go build -gcflags='-l -m'
这些命令行标志选项是传递给go编译器的,因此可以使用下面的命令查看编译器支持的选项集合:
go tool compile -help
下面是一些常用的命令行标志选项:
-l:关闭内敛。
-N:关闭代码优化。
-m:输出逃逸分析的分析决策过程(哪些变量在栈上分配,哪些变量在堆上分配)。
-S:输出汇编代码。
在运行调试器对程序进行调试之前,我们通常使用"-N -l"两个选项关闭对代码的内联和优化,这样能得到更多的调试信息。
1.4 -ldflags:传给链接器的标志选项集合
go build也支持通过-ldflags为链接器传递标志选项。链接器在linux下的位置为$GOROOT/pkg/tool/linux_amd64/link。
使用下面的命令可以查看链接器支持的选项集合:
go tool link -help
下面三个是常用的命令行选项标志:
-X:设定包中string类型变量的值。
-s:不生成符号表。
-w:不生成DWARF(Debugging With Attributed Record Formats)调试信息。
-X选项的例子:可以在编译时指定程序的版本。
package main
import (
"fmt"
"os"
)
var version string
func main() {
if len(os.Args) > 1 && os.Args[1] == "version" {
fmt.Println(version)
}
}
默认情况下,go build构建出的可执行文件中都是包含符号表和DWARF格式的调试信息,这虽然让最终二进制文件的体积都增加了,但是符号表和调试信息对于生产环境下程序异常的现场保存和在线调试都有着重要意义,如果不在意这些信息或者对应用的大小比较敏感,那么可以通过-s和-w选项将这些信息从最终的二进制文件中剔除。