首页 > 其他分享 >go run、build、install、get的原理和区别

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

时间:2023-04-04 22:14:16浏览次数:50  
标签:文件 run get 命令 源码 build go 编译

学习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

参考链接:https://zhuanlan.zhihu.com/p/62

标签:文件,run,get,命令,源码,build,go,编译
From: https://www.cnblogs.com/lgh344902118/p/17288070.html

相关文章

  • blockchain | 将合约部署到geth
    blockchain|将truffle合约部署到geth【一路踩坑】上一篇文章里我用truffle编写了一个测试合约,这次得部署到链子上。本文包含诸多试错过程先把geth跑起来1.更改配置文件更改truffle-config.js主要就是配置一下网络(对接geth)2.创建迁移脚本据教程的说法是要文件名写......
  • Redis未授权访问Getshell
    漏洞成因有些redis绑在0.0.0.0:6379,没有开启验证或者没有设置对未知ip来源进行限制以及默认的空密码就导致了redis默认访问但是这个普遍的漏洞极可能造成后门植入getshell,也可能造成反弹shell权限维持,甚至会造成ssh直接免密连接服务器开始复现搭建环境服务器操作系统为ubuntu......
  • docker run 参数详解
    命令格式:dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]Usage:Runacommandinanewcontainer中文意思为:通过run命令创建一个新的容器(container)常用选项说明-d,--detach=false,指定容器运行于前台还是后台,默认为false-i,--interactive=false,打开STDIN,用于控制台交互-t,-......
  • 开源好物推荐:全栈测试平台RunnerGo
    做软件测试的同学在工作时应该都碰到过这种情况:接口管理、接口测试用postman、Apipost等接口管理工具,性能测试用jmeter、loadrunner等性能测试工具,接口自动化则是jmeter脚本或者python脚本配合jenkins使用。这种情况极大的降低了研发效率,今天给大家推荐一款入选GiteeGVP的开源测......
  • GetNeighbourFaces逻辑
    classFilletRadiusDelegate:publicQItemDelegateclassFilletRadiusModel:publicQStandardItemModelclassDlgGetNeighborFaces:publicQWidget,publicGui::SelectionObserverclassGetNeighborFacesDialog:publicQDialogclassTaskGetNeighborFaces:p......
  • 开源好物推荐:全栈测试平台RunnerGo
    做软件测试的同学在工作时应该都碰到过这种情况:接口管理、接口测试用postman、Apipost等接口管理工具,性能测试用jmeter、loadrunner等性能测试工具,接口自动化则是jmeter脚本或者python脚本配合jenkins使用。这种情况极大的降低了研发效率,今天给大家推荐一款入选GiteeGVP的开源......
  • 【Python】ini解析ERROR:没有实例属性‘__getintem__’
    abaquspython搭配ini时,出现AttributeError:ConfigParserinstancehasnoattribute'getitem'20230404edit情况错误代码:fromConfigParserimportConfigParserconf=ConfigParser()conf.read(IniFilePath)layupFile=conf['DampCal']['lay......
  • loadrunner 录制脚本 无法打开页面
    问题:使用loadrunner 12.55录制脚本时,可以启动浏览器,但是浏览器内容一直加载不出来,页面空白 解决方案:1.开始录制前设置Recordingoptions--->httppropterties---->Advanced--->勾选 userlocalLoadrunnerproxyto。。。。。......
  • NodeIP、PodIP、ClusterIP、NodePort、Port、TargetPort、HostPort
    目录1、IP类型1.1、NodeIP1.2、PodIP1.3、ClusterIP2、Port类型2.1、nodePort2.1、port2.1、targetPort2.1、hostPort 1、IP类型Kubernetes集群里有三种IP地址,分别如下:名称说明NodeIPWorker节点的IP地址,即物理网卡的IP地址。PodIP......
  • RK3588开发板Buildroot 系统功能测试U盘测试一
    当插入U盘以后,U盘的格式必须为FAT32格式,大小在32G以下(底板上4个USB接口都可以插入U盘),如下图所示。方法一:1将U盘(U盘的格式必须为FAT32格式,大小在32G以下)插到开发板的usb接口,串口打印信息如下所示,U盘的设备节点是/dev/sda1。U盘的设备节点不是固定的,根据实......