1、命令源码文件
声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。
命令源码文件是 Go 程序的入口。
同一个代码包中最好也不要放多个命令源码文件。多个命令源码文件虽然可以分开单独 go run
运行起来,但是无法通过go build
和 go install
。
2、库源码文件
库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。
库源码文件被安装后,相应的归档文件(.a 文件)会被存放到当前工作区的 pkg 的平台相关目录下。
3、测试源码文件
名称以 _test.go 为后缀的代码文件,并且必须包含 Test 或者 Benchmark 名称前缀的函数:
func TestXXX( t *testing.T) {
}
名称以 Test 为名称前缀的函数,只能接受 *testing.T 的参数,这种测试函数是功能测试函数。
func BenchmarkXXX( b *testing.B) {
}
名称以 Benchmark 为名称前缀的函数,只能接受 *testing.B 的参数,这种测试函数是性能测试函数。
专门用来运行命令源码文件的命令,注意,这个命令不是用来运行所有 Go 的源码文件的!
go run
命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main 包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么 go run
命令就只会打印错误提示信息并退出,而不会继续执行。
最终go run
命令是生成了2个文件,一个是归档文件,一个是可执行文件。
go run
命令在第二次执行的时候,如果发现导入的代码包没有发生变化,那么go run
不会再次编译这个导入的代码包。直接静态链接进来。
go build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。
go build
命令后,不会产生任何文件。go build
命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin
目录下生成相应的exe文件,需要执行go install
或者使用 go build -o
路径/可执行文件。go build
之后加上文件名,例如go build a.go
;go build
命令默认会编译当前目录下的所有go文件。go build -o 可执行文件名
,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。go build
会忽略目录下以”_”或者”.”开头的go文件。当代码包中有且仅有一个命令源码文件的时候,在文件夹所在目录中执行 go build 命令,会在该目录下生成一个与目录同名的可执行文件。
go build
用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件,即库源码文件,go build
执行完是不会产生任何结果的。这种情况下,go build
命令只是检查库源码文件的有效性,只会做检查性的编译,而不会输出任何结果文件。
go build
后面不追加目录路径的话,它就把当前目录作为代码包并进行编译。go build
命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。
go build
执行过程和go run
大体相同,唯一不同的就是在最后一步,go run
是执行了可执行文件,但是 go build
命令,只是把库源码文件编译了一遍,然后把可执行文件移动到了当前目录的文件夹中。
go install
命令是用来编译并安装代码包或者源码文件的。
go install
命令在内部实际上分成了两步操作:第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到 $GOPATH/pkg
或者$GOPATH/bin
。
go install
带main函数的go文件产生的,有函数入口,所有可以直接运行。go install
不包含main函数的go文件产生的,没有函数入口,只能被调用。go install
用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与go build
命令一样,传给 go install
命令的代码包参数应该以导入路径的形式提供。并且,go build
命令的绝大多数标记也都可以用于go install
。
实际上,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” 的标签或者分支。如果找到指定的标签或者分支,则将本地代码包的版本切换到此标签或者分支。如果没有找到指定的标签或者分支,则将本地代码包的版本切换到主干的最新版本。
go fix
用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1
go version
查看go当前的版本
go env
查看当前go的环境变量
go list
列出当前全部安装的package