GoLang之Go编译相关的命令详解(4)

1.介绍

直接在终端执行:

go

就能得到和 go 相关的命令简介:

2351afd657fd76816a69df5760d58b5a.png

和编译相关的命令主要是:

go build
go install
go run

2.go build

go build$GoPath/src/packagego build
go help buildgo build
usage: go build [-o output] [-i] [build flags] [packages]
-o-i.a
build, clean, get, install, list, run, test
.a
func main()package main_test.go
go build*_test.go
go buildhello-world

38ee49205af6043a8a69c9e343196253.png

最左边可以看到项目的结构,包含三个文件夹:bin,pkg,src。其中 src 目录下有一个 main.go,里面定义了 main 函数,是整个项目的入口,也就是前面提过的所谓的命令源码文件;src 目录下还有一个 util 目录,里面有 util.go 文件,定义了一个可以获取本机 IP 地址的函数,也就是所谓的库源码文件。

util$GoRoot/src$GoPath/src/usr/local/go/src/fmt/Users/qcrao/hello-world/src/util

最右边是库函数的源码,实现了获取本机 IP 的函数。

go buildsrc./src
hello world!
Local IP: 192.168.1.3

我们也可以指定生成的可执行文件的名称:

go build -o bin/hello
src

其实,util 包可以单独被编译。我们可以在项目根目录下执行:

go build util
./src/utilgo build

当然,直接编译库源码文件不会生成 .a 文件,因为:

go build 命令在编译只包含库源码文件的代码包(或者同时编译多个代码包)时,只会做检查性的编译,而不会输出任何结果文件。

为了展示整个编译链接的运行过程,我们在项目根目录执行如下的命令:

go build -v -x -work -o bin/hello src/main.go
-v-x-work

执行结果:

76b509b488eafc9d549d7d35b6591bde.png

go build.go
main.go.a

另外,第一行显示了编译过程中的工作目录,此目录的文件结构是:

8aed04ccc2ac0ebadfed0e8b9e8666ca.png

可以看到,和 hello-world 目录的层级基本一致。command-line-arguments 就是虚拟的 main.go 文件所处的包。exe 目录下的可执行文件在最后一步被移动到了 bin 目录下,所以这里是空的。

go build

正常情况下,这些依赖关系会形成一棵倒着生长的树,树根在最上面,就是 main.go 文件,最下面是没有任何其他依赖的包。编译器会从最左的节点所代表的包开始挨个编译,完成之后,再去编译上一层的包。

从代码包编译的角度来说,如果代码包 A 依赖代码包 B,则称代码包 B 是代码包 A 的依赖代码包(以下简称依赖包),代码包 A 是代码包 B 的触发代码包(以下简称触发包)。

go build

顺便推荐一个浏览器插件 Octotree,在看 github 项目的时候,此插件可以在浏览器里直接展示整个项目的文件结构,非常方便:

b57887756c917744a3ffd5ee84c93bb7.png

到这里,你一定会发现,对于 hello-wrold 文件夹下的 pkg 目录好像一直没有涉及到。

.a.a
-i.a
go build -i src/main.go

47c70484f0dc02b1fcf17c714603918f.png

darwin_amd64
Go-Questions

3.go install

go installgo build

还是使用之前 hello-world 项目的例子,我们先将 pkg 目录删掉,在项目根目录执行:

go install src/main.go

或者

go install util
pkgutil.a

并且,在执行前者的时候,会在 GOBIN 目录下生成名为 main 的可执行文件。

go install.apkg
go installGo 命令教程

4.go run

go run

在 hello-world 项目的根目录,执行 go run 命令:

go run -x -work src/main.go

-x 可以打印整个过程涉及到的命令,-work 可以看到临时的工作目录:

948490d123530e5cc79e90edbd1ddb25.png

从上图中可以看到,仍然是先编译,再连接,最后直接执行,并打印出了执行结果。

第一行打印的就是工作目录,最终生成的可执行文件就是放置于此:

37b39b8d03d7ac827f9f8afa9cf8eec4.png

main 就是最终生成的可执行文件。