go run、build、install、get的原理和区别

学习go也有好些年头了,都没怎么研究过go的编译命令。真是惭愧。今天学习并记录下

结论:

go run 专门用来运行命令源码文件的命令,一般用来运行单个文件

go build 主要是用于测试编译。编译某个包或者项目,在当前目录下生成可执行文件

go install 编译并安装代码包或者源码文件的。

go get 用于从远程代码仓库(比如 Github )上下载代码包并更新mod

go 1.17之后go get只下载源码,并将依赖添加到go.mod。get install用来下载和安装三方库

go常用的命令标记

-n 和-x基本都用来打印执行的命令,-x除了打印还会运行

现在来了解下go run、go build、go install和go get

1、go run

专门用来运行命令源码文件的命令,不是用来运行所有go源码文件的

go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main 包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么 go run 命令就只会打印错误提示信息并退出,而不会继续执行。

go run -n 查看执行过程

先创建临时文件b001,在b001中创建一个importcfg文件,将使用的import文件写入,然后切换到目录下,执行compile命令,创建一个importcfg.link文件,将compile生成的link写入。然后创建临时文件exe,将导入文件和源码文件连接在一起生成可执行文件。

通过compile生成link文件,然后将link和源文件一起打包成exe

生成的临时文件可以用go run -work看到

go run命令是生成了2个文件,一个是归档文件,一个是可执行文件。

2、go build

go build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。

如果是普通包,当你执行go build命令后,不会产生任何文件。

如果是main包,当只执行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 run,多了一步mv 将exe临时文件下的可执行文件重命名并移动当当前目录下

3、go install

go install 命令是用来编译并安装代码包或者源码文件的。

分两步

第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到$GOPATH/pkg或者​$GOPATH/bin

可执行文件: 一般是 go install 带main函数的go文件产生的,有函数入口,所有可以直接运行。

.a应用包: 一般是 go install 不包含main函数的go文件产生的,没有函数入口,只能被调用。

4、go get

go get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包。注意,go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中,并安装。

备注1.17后,go get仅用来下载库和更新mod文件,并不会安装。

go get常用标记

其他命令

go clean 命令是用来移除当前源码包里面编译生成的文件,这些文件包括

_obj/ 旧的object目录,由Makefiles遗留

_test/ 旧的test目录,由Makefiles遗留

_testmain.go 旧的gotest文件,由Makefiles遗留

test.out 旧的test记录,由Makefiles遗留

build.out 旧的test记录,由Makefiles遗留

*.[568ao] object文件,由Makefiles遗留

DIR(.exe) 由 go build 产生

DIR.test(.exe) 由 go test -c 产生

MAINFILE(.exe) 由 go build MAINFILE.go产生

go fmt 命令主要是用来帮你格式化所写好的代码文件。

go test 命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。默认的情况下,不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然你也可以带上参数,详情请参考go help testflag

go doc 命令其实就是一个很强大的文档工具。

go fix 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1

go version 查看go当前的版本

go env 查看当前go的环境变量

go list 列出当前全部安装的package

参考链接:

posted @ 2023-04-04 21:58  菲菲菲菲菲常新的新手  阅读(272)  评论(0编辑  收藏  举报