Go的编译和运行
Go的编译
Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。
Go语言编译器的源代码在 src/cmd/compile 目录中,目录下的文件共同构成了Go语言的编译器,学过编译原理的人可能听说过编译器的前端和后端,编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标机器能够运行的机器码。

Go的编译器在逻辑上可以被分成四个阶段:词法与语法分析、类型检查和 AST 转换、通用 SSA 生成和最后的机器代码生成。
Go的运行
Go build
go build命令用来启动编译,可以将go编写的程序与相关以来编译成一个可执行文件。
#[name]参数可传入多个
go build [name]
-
当
[name]为空时:如果当前目录存在main包,则会生成一个与当前目录名相同的可执行文件,在不同的操作系统中,生成的文件不同。 -
当
[name]不为空时:- 如果
[name]为非main包下的源文件名,编译器将只对该包进行语法检测,不生成可执行文件。 - 如果
[name]为main包下的源文件名(可能有多个),编译器将生成一个与第一个[name]同名的可执行文件,在不同的操作系统中,生成的文件不同。
- 如果
在上一章中,我们创建了第一个Go的程序,我们可以对第一个项目进行build。
#进入项目目录
cd myfirstproject
#进行编译生成 可以不填写参数
go build [main.go]
#当前目录下会产生一个可执行文件
#如果带参数,将会生成名叫main的可执行文件
main
#如果不带参数,将会生成与当前目录名相同的可执行文件
myfirsproject
#运行可执行文件
./main #./myfristproject
打印出Hello World!。
Go run
go run命令是将go build命令和执行生成的可执行文件二合一的命令,该命令不会生成可执行文件,但是可以运行。但在go run命令中,参数是不可以省略的,并且参数必须时同一main包下的所有源文件名。
go run main.go
这将会直接打印出Hello World!,并且不产生可执行文件。
Go install
go install命令会把项目进行编译并安装,go install命令将会把可执行文件放入你的工作空间($GOPATH)下的bin目录中,将库文件放入工作空间($GOPATH)下的pkg目录中。如果你配置了环境变量的情况下($GOPATH/bin),那么你就可以不在可执行文件的目录下运行可执行文件。
Go get
go get命令可以用于拉取远程项目,该命令需要git,所以在使用该命令前,需要先安装git。当你用go get从远程分支中拉取项目时,该项目会被编译安装,可在工作空间目录下的bin目录中找到可执行文件。如果当前项目已从远程拉下来,使用go get -u还可以更新该项目。
其他命令
如果你还对其他命令感兴趣,可以使用go help命令查看所有命令的解释。如果你想了解一个命令,你还可以使用go help <topic>查看更多信息,例如:go help build。