声明自己属于main 代码包、包含无参数声明和结果声明的main 函数。
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的bin文件夹下;如果有多个工作区,就会安装到GOBIN指向的目录下。
命令源码文件是Go程序的入口。
(2)库源码文件库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。
库源码文件被安装后,相应的归档文件(.a文件)会被存放到当前工作区的 pkg的平台相关目录下。
(3)测试源码文件名称以_test.go为后缀的代码文件,并且必须包含Test或者Benchmark 名称前缀的函数︰
func TestXXX( t *testing.T){
}
名称以Test为名称前缀的函数,只能接受*testing.T的参数,这种测试函数是功能测试函数。
func BenchmarkXXX(b *testing.B){
}
命令源码文件是可以单独运行的。可以使用go run命令直接运行,也可以通过go build或go install 命令得到相应的可执行文件。所以命令源码文件是可以在机器的任何目录下运行的。
2.Go的命令与编译相关的命令有build、get、list、run这四个。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFhVtKfl-1643386678250)(F:\笔记\Go笔记\笔记截图\Go命令参数.png)]
(1)go run专门用来运行命令源码文件的命令,注意,这个命令不是用来运行所有Go的源码文件的!
go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于main包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么go run 命令就只会打印错误提示信息并退出,而不会继续执行。
(2)go buildgo 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 命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。
(3)go installgo 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命令后面如果跟了命令源码文件以及相关库源码文件作为参数的话,只有这些文件会被编译并安装。
(4)go getgo 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”的标签或者分支。如果找到指定的标签或者分支,则将本地代码包的版本切换到此标签或者分支。如果没有找到指定的标签或者分支,则将本地代码包的版本切换到主干的最新版本。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)