🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Go 编译器 Go 编译器在 go 工具的帮助下执行,该工具不仅生成可执行文件,还执行更多的操作。 > Tip: 本节中使用的`unsafe.go`文件不包含任何内容特殊代码–所提供的命令将在每个有效的 Go 源文件上运行。 你可以通过`go tool compile` 命令编译 Go 源代码。你将得到一个**目标文件**,这将是一个以`.o`扩展结尾的文件。在 macOS Mojave 环境下执行的下一个命令的输出中对此进行了说明: ```shell $ go tool compile unsafe.go $ ls -l unsafe.o -rw-r--r-- 1 mtsouk staff 6926 Jan 22 21:39 unsafe.o $ file unsafe.o unsafe.o: current ar archive ``` 目标文件是包含目标代码的文件,该目标代码是可重定位格式的机器代码,在大多数情况下,这些代码不能直接执行。可重定位格式的最大优点是在链接阶段它只需要较少的内存。 如果你在运行`go tool compile`的时候加上了`-pack`标志,你将会得到**压缩文件**而非目标文件: ```shell $ go tool compile -pack unsafe.go $ ls -l unsafe.a -rw-r--r-- 1 mtsouk staff 6926 Jan 22 21:40 unsafe.a $ file unsafe.a unsafe.a: current ar archive ``` 压缩文件是包含一个或多个文件的二进制文件,主要是 用于将多个文件分组为一个文件。这些格式之一是 `ar`,它是 Go 使用的格式。 你可以像这样打印出一个 `.a` 压缩文件的内容: ```shell $ ar t unsafe.a __.PKGDEF _go_.o ``` `go tool compile` 另一个真正有价值的命令行标志是`-race`,它使你能够检测**竞争条件**。你将在第10章*Go的并发性-高级主题*中了解有关竞争条件以及为什么要避免竞争条件的更多信息。 本章的最后讨论汇编语言和节点树的时候,你还会学到一个更多有用的`go tool compile`命令。不过目前你可以尝试一下下面的命令: ``` $ go tool compile -S unsafe.go ``` 你可能会发现,以上命令的输出会让你难以理解,这正说明了Go可以很好地帮你隐藏不必要的复杂性,除非你要求Go展示出来。