go run:go run 编译并直接运行程序,它会产生一个临时文件(但不会生成 .exe 文件),直接在命令行输出程序执行结果,方便用户调试。
go build:go build 用于测试编译包,主要检查是否会有编译错误,如果是一个可执行文件的源码(即是 main 包),就会直接生成一个可执行文件。
go install:go install 的作用有两步:第一步是编译导入的包文件,所有导入的包文件编译完才会编译主程序;第二步是将编译后生成的可执行文件放到 bin 目录下($GOPATH/bin),编译后的包文件放到 pkg 目录下($GOPATH/pkg)。
go build与go install的
用法:
go build/install <packages>
说明:<package>是从$GOPATH/src路径下面的目录名
如:
# 编译安装package lib
go install lib
多个包名
# 同时编译安装lib2和lib/util两个package
go install lib2 lib/util
另外,如果当前工作路径已经在package目录下面了,则可以不需要指定package名,例如:
$ cd $GOPATH/lib/util
$ go install
功能:
- build
对于库,只是验证编译能够成功,不会生成目标库文件。
对于可执行程序,会生成目标可执行文件,并放在当前目录下面。
- install
对于库,会生成目标库文件,并且放置到GOPATH/;对于可执行文件,会生成目标可执行文件,且放到GOPATH/BIN目录下。
结论
对于含主函数的go文件,go build 和 go install 都能成功编译它们并生成可执行文件,就是生成的可执行文件的地方不一样
对于不含主函数的go的包文件,只有 go install 能在pkg中生成包文件,而 go build 能对go的包文件起作用,就是最终文件夹和执行 go build 之前一样,好像 go build 什么也没做,很迷。
如何区分库和可执行程序目录
go编译器如何区分这是一个库目录还是一个可执行文件目录,因为库目录需要安装到GOPATH/pkg路径下面,可执行程序需要安装到GOPATH/bin路径下面。规则就是:
- 这个目录的包名字是不是main。如果是,则go认为这是一个可执行程序目录;如果不是,go就认为这是一个库目录
这里强调一点:
包对应一个目录,并不包含路径信息。
包只包含一个目录下面的文件,并不包含子目录。
即,每一个目录都是独立编译成一个包文件的,这个包文件并不包含目录下面的子目录,因为子目录是另一个独立的包,需要独立编译;文件路径上的包含关系并没有包之间的包含关系,包没有路径递归这个属性。
库的使用
关于库的使用,即在编译可执行文件时如何使用库文件,是使用的pkg目录下的编译好的库.a文件,还是src目录下面的库源文件,请参考下面文件链接(谢AllenRen_061d同学指正)。