Go 编译器

Go编译器需要在go tool的帮助下执行。go tool除了生成可执行文件之外还有很多其他功能。

本章节中使用的unsafe.go文件不包含任何特殊代码-所提供的命令将适用于每个有效的Go源文件。接下来你将会看到unsafe.go的内容。

如果你使用go tool compile命令编译unsafe.go文件,会得到一个扩展名为.o的目标文件。下面的展示这个命令在macOS操作系统中执行的结果:

  1. $ go tool compile unsafe.go
  2. $ ls -l unsafe.o
  3. -rw-r--r-- 1 mstouk staff 5495 Oct 30 19:51 unsafe.o
  4. $ file unsafe.o
  5. unsafe.o: data

目标文件是包含了目标代码的二进制文件,它以可重定位格式的形式展现,很多时候不能被直接执行。可重定位格式的最大好处是在链接阶段它需要尽可能少的内存。

如果执行go tool compile -pack命令,将会得到一个压缩文件。

  1. $ go tool compile -pack unsafe.go
  2. $ ls -l unsafe.a
  3. -rw-r--r-- 1 mtsouk staff 5680 Oct 30 19:52 unsafe.a
  4. $ file unsafe.a
  5. unsafe.a: current ar archive

压缩文件也是一个二进制文件,但是它包含了一个或者多个文件,主要的目的是把多个文件组织到单个文件中。Go使用的压缩文件被称为ar

使用下面的命令可以列出.a压缩文件的内容:

  1. $ ar t unsafe.a
  2. __.PKGDEF
  3. _go_.o

go tool compile的另一个真正有价值的命令行标志是-race,它允许您检测竞态条件。在第十章中你会学到更多关于竞态条件以及为什么要避免竞态条件的知识点。

本章的最后讨论汇编语言和节点树的时候,你还会学到 一个同样有用的go tool compile命令。现在为了撩动你,尝试一下下面的命令吧:

$ go tool compile -S unsafe.go

你可能发现,以上命令的输出会让你难以理解,这正说明了Go可以很好地帮你隐藏不必要的复杂性,除非你要求Go展示出来。