GoLang之Go编译相关的命令详解(4)
1.介绍
直接在终端执行:
go
就能得到和 go 相关的命令简介:

和编译相关的命令主要是:
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

最左边可以看到项目的结构,包含三个文件夹: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
执行结果:

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

可以看到,和 hello-world 目录的层级基本一致。command-line-arguments 就是虚拟的 main.go 文件所处的包。exe 目录下的可执行文件在最后一步被移动到了 bin 目录下,所以这里是空的。
go build
正常情况下,这些依赖关系会形成一棵倒着生长的树,树根在最上面,就是 main.go 文件,最下面是没有任何其他依赖的包。编译器会从最左的节点所代表的包开始挨个编译,完成之后,再去编译上一层的包。
从代码包编译的角度来说,如果代码包 A 依赖代码包 B,则称代码包 B 是代码包 A 的依赖代码包(以下简称依赖包),代码包 A 是代码包 B 的触发代码包(以下简称触发包)。
go build
顺便推荐一个浏览器插件 Octotree,在看 github 项目的时候,此插件可以在浏览器里直接展示整个项目的文件结构,非常方便:

到这里,你一定会发现,对于 hello-wrold 文件夹下的 pkg 目录好像一直没有涉及到。
.a.a
-i.a
go build -i src/main.go

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 可以看到临时的工作目录:

从上图中可以看到,仍然是先编译,再连接,最后直接执行,并打印出了执行结果。
第一行打印的就是工作目录,最终生成的可执行文件就是放置于此:

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