声明自己属于main 代码包、包含无参数声明和结果声明的main 函数。
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的bin文件夹下;如果有多个工作区,就会安装到GOBIN指向的目录下。
命令源码文件是Go程序的入口。
库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。
库源码文件被安装后,相应的归档文件(.a文件)会被存放到当前工作区的 pkg的平台相关目录下。
名称以_test.go为后缀的代码文件,并且必须包含Test或者Benchmark 名称前缀的函数︰
func TestXXX( t *testing.T){
}
名称以Test为名称前缀的函数,只能接受*testing.T的参数,这种测试函数是功能测试函数。
func BenchmarkXXX(b *testing.B){
}
命令源码文件是可以单独运行的。可以使用go run命令直接运行,也可以通过go build或go install 命令得到相应的可执行文件。所以命令源码文件是可以在机器的任何目录下运行的。
与编译相关的命令有build、get、list、run这四个。
专门用来运行命令源码文件的命令,注意,这个命令不是用来运行所有Go的源码文件的!
go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于main包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么go run 命令就只会打印错误提示信息并退出,而不会继续执行。
go build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。
1.如果是普通包,当你执行go build命令后,不会产生任何文件。
2.如果是main包,当只执行go build命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH目录下生成相应的exe文件,需要执行go install或者使用go build -o路径/可执行文件。
3.如果某个文件夹下有多个文件,而你只想编译其中某一个文件,可以在go build 之后加上文件名,例如go build a.go; go build命令默认会编译当前目录下的所有go文件。
4.你也可以指定编译输出的文件名。比如,我们可以指定go build -o可执行文件名,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。
5.go build会忽略目录下以”_“或者”."开头的go文件。
6.如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件.
那go build和go install究竟干了些什么呢?
先来说说go build。go build 用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件,即库源码文件,go build执行完是不会产生任何结果的。这种情况下,go build 命令只是检查库源码文件的有效性,只会做检查性的编译,而不会输出任何结果文件。
go build编译命令源码文件,则会在该命令的执行目录中生成一个可执行文件,上面的例子也印证了这个过程。
go build后面不追加目录路径的话,它就把当前目录作为代码包并进行编译。go build 命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。
go install命令是用来编译并安装代码包或者源码文件的。
go install命令在内部实际上分成了两步操作︰第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到GOPATH/pkg或者GOPATH/bin。
可执行文件:一般是go install 带main函数的go文件产生的,有函数入口,所有可以直接运行。
.a应用包:一般是go install 不包含main函数的go文件产生的,没有函数入口,只能被调用。
go install用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与go build 命令一样,传给go install 命令的代码包参数应该以导入路径的形式提供。并且,go build命令的绝大多数标记也都可以用于、
实际上, go install命令只比 go build命令多做了一件事,即:安装编译后的结果文件到指定目录。安装代码包会在当前工作区的pkg 的平台相关目录下生成归档文件(即.a文件)。
安装命令源码文件会在当前工作区的bin目录(如果GOPATH下有多个工作区,就会放在GOBIN目录下),生成可执行文件。
同样, go install命令如果后面不追加任何参数,它会把当前目录作为代码包并安装。这和go build命令是完全一样的。
go install命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被安装。
go install命令后面如果跟了命令源码文件以及相关库源码文件作为参数的话,只有这些文件会被编译并安装。
go get命令用于从远程代码仓库(比如Github)上下载并安装代码包。注意,go get命令会把当前的代码包下载到$GOPATH中的第一个工作区的src录中,并安装。
使用go get下载第三方包的时候,依旧会下载到$GOPATH的第一个工作空间,而非vendor目录。当前工作链中并没有真正意义上的包依赖管理,不过好在有不少第三方工具可选。
如果在go get 下载过程中加入-d标记,那么下载操作只会执行下载动作,而不执行安装动作。比如有些非常特殊的代码包在安装过程中需要有特殊的处理,所以我们需要先下载下来,所以就会用到-d标记。
还有一个很有用的标记是-u标记,加上它可以利用网络来更新已有的代码包及其依赖包。如果已经下载过一个代码包,但是这个代码包又有更新了,那么这时候可以直接用-u标记来更新本地的对应的代码包。如果不加这个-u标记,执行go get一个已有的代码包,会发现命令什么都不执行。只有加了-u标记,命令会去执行git pull命令拉取最新的代码包的最新版本,下载并安装。
命令go get还有一个很值得称道的功能——智能下载。在使用它检出或更新代码包之后,它会寻找与本地已安装Go语言的版本号相对应的标签〈tag)或分支(branch)。比如,本机安装Go语言的版本是1.x,那么go get命令会在该代码包的远程仓库中寻找名为“go1”的标签或者分支。如果找到指定的标签或者分支,则将本地代码包的版本切换到此标签或者分支。如果没有找到指定的标签或者分支,则将本地代码包的版本切换到主干的最新版本。