首页 > 其他分享 >go get 和 go install 对比

go get 和 go install 对比

时间:2023-07-07 15:11:21浏览次数:41  
标签:编译 代码 get 命令 install go

(一)命令定义和区别

go installgo get 都是 Go 语言的工具命令,但它们之间有一些区别。

  • go get:用于从远程代码存储库(如 GitHub)中下载或更新 Go 代码包。它会下载代码包并将其存储在 $GOPATH/src 目录下对应的位置,并编译代码包中的程序和库。如果目标包之前已经被下载过了,那么 go get 会尝试更新到最新版本,并重新编译程序和库文件。在更新完代码包后,go get 还会自动把下载的代码包的可执行文件复制到 $GOPATH/bin 目录下,以方便直接使用该可执行文件。
  • go install:用于编译并安装 Go 代码包,并将其生成的可执行程序或库文件存储到 $GOPATH/bin 或者 $GOPATH/pkg 目录下。如果你在项目目录下执行 go install,它将会编译并安装当前项目的代码,生成可执行文件并将其保存到 $GOPATH/bin 目录下(如果项目是一个库,则生成的是 .a 文件,并将其存储到 $GOPATH/pkg 目录下)。

因此,go get 用于下载和更新代码包,并产生对应的可执行程序,而 go install 用于将一个 Go 代码包转化为可执行程序或库文件,并安装到系统路径以供直接使用。

使用表格形式对 go getgo install 进行比较:

 

二)go get 是否包含了 go install

可以认为 go get 命令包含了 go install 命令的功能,但它们之间还是存在一些细微差别。

go get 命令用于从远程代码库中下载或更新 Go 代码包,并自动编译生成相应的可执行程序,同时还将其安装到 $GOPATH/bin 目录下,以便简化程序的运行。go get 命令不需要指定包的路径,它会使用 Go 语言规范中约定的包导入路径来获取包信息,并自动处理包的依赖关系以方便编译。

相比之下,go install 命令则更为灵活,它可以编译并安装当前项目的代码,生成可执行文件或库,并将其保存在 $GOPATH/bin$GOPATH/pkg 目录下。同时,go install 命令还可以通过指定 -ldflags 参数来修改二进制文件的链接标志,从而将一些自定义的元信息加入到二进制文件中,使得可以在运行时通过代码读取这些信息。

在 Go 1.16 版本之后,go get 命令已经默认使用了 Go 模块管理工具。而 go install 命令则始终需要先进入到处于 Go 模块管理的路径下,然后才能使用该命令编译并安装相关代码包。

综上所述,可以认为 go get 命令包含了 go install 命令的部分功能,但是在一些特殊情况下,还是需要使用 go install 命令来进行更灵活的编译和安装操作。

(三)为什么要用 go install

在使用 go get 命令下载并安装代码包时,有些情况下生成的可执行文件可能无法生效,这通常是因为 Go 语言版本不兼容或编译环境不同导致的。而使用 go install 命令则可以避免这些问题,下面列举了几种常见情况:

  1. 版本不兼容:如果 go get 命令下载的代码包和当前使用的 Go 语言版本不兼容,那么 go get 命令可能会产生编译错误或生成无法运行的可执行文件。对于这种情况,使用 go install 命令可以保证使用的是当前系统上与 Go 语言版本兼容的编译器。
  2. 编译环境不同:在使用 go get 命令下载代码包时,有时它们的编译环境与当前环境不同,可能会导致可执行文件无法正常工作。而在使用 go install 命令时,该命令会在当前环境下重新编译源代码并生成可执行文件,从而能够更加稳定地运行代码。
  3. 依赖关系复杂:在使用 go get 命令下载大型的代码包时,它可能会自动下载和安装大量依赖项。这样可能会导致依赖关系变得复杂而难以管理,有时可能会在下载或编译依赖项时产生错误或警告。而 go install 命令会直接从当前路径下对应依赖项中寻找依赖项,因此可以避免这种情况下带来的复杂性和错误。

综上所述,尽管 go get 命令十分方便快捷,但在遇到一些特殊情况时,仍然需要使用 go install 命令以获得更加稳定的编译和安装效果。

可以使用如下表格来对比 go getgo install 的编译区别:

 


 

 

 

 

 

 

 

 

 


 

标签:编译,代码,get,命令,install,go
From: https://www.cnblogs.com/xingxia/p/golang_get_and_install.html

相关文章

  • pip install -r requirements.txt安装问题
    pipinstall-rrequirements.txt安装问题一、requirements.txt介绍:python项目中必须包含一个requirements.txt文件,用于记录所有依赖包及其精确的版本号。以便新环境部署。requirements.txt可以通过pip命令自动生成和安装。Pycharm的Terminal端生成requirements.txt文件......
  • RunnerGo集成三方消息通知,可配置到性能测试定时任务
    测试人员在配置自动化测试、性能测试脚本时需要配置测试报告通知人,近期更新中RunnerGo消息通知已接入第三方,在配置测试报告通知人时可以选择飞书、企业微信、钉钉、邮箱。本篇文章会介绍如何配置RunnerGo的三方消息通知。RunnerGo目前支持创建飞书群机器人、飞书企业应用,企业微......
  • get方法怎么传json
     1.get方法是一种常用的HTTP请求方法,它能够将数据请求从客户端发送到服务器。而传递JSON数据则可以在请求和响应之间以更复杂的方式传递数据。下面我们来看一下如何用get方法传送JSON数据。vardata={name:'Alice',age:18,email:'[email protected]'}varurl='ht......
  • django分表存儲的model
    django分表存儲的model設計importjsonfromdjango.dbimportmodelsfromdjango.httpimportHttpResponseclassObject:definit(self,**kwargs):self.dict.update(kwargs)def_model_new(cls,args,**kwargs):returncls(args,**kwargs)classShardModel(object):......
  • 华为超算平台git、cmake、wget、curl报错:SSLv3_client_method version OPENSSL_1_1_0
    最近在使用超算平台时报错,不管是git、cmake、wget、curl中的哪个都报错,大致错误: /usr/bin/cmake3:relocationerror:/usr/lib64/libcurl.so.4:symbolSSLv3_client_methodversionOPENSSL_1_1_0notdefinedinfilelibssl.so.1.1withlinktimereference  参考网......
  • Django创建多对多表关系的三种方式
    一、全自动(不推荐)优点:djangoorm会自动创建第三张表缺点:只会创建两个表的关系字段,不会再额外添加字段,可扩展性差classBook(models.Model):#...authors=models.ManyToManyField(to='Author')classAuthor(models.Model):#...pass 二、......
  • P3089 [USACO13NOV] Pogo-Cow S 弹簧踩高跷
    P3089[USACO13NOV]Pogo-CowS弹簧踩高跷洛谷题目传送门目录P3089[USACO13NOV]Pogo-CowS弹簧踩高跷题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示题目大意方法一(线段树维护dp)code方法二(单调队列维护dp)code题目描述Inanill-conceivedattempttoenhanc......
  • 活动开启 | 以梦筑码 · 不负韶华 开发者故事征集令,讲出你的故事,有机会参加HDC.Togeth
     HarmonyOS面世以来,经历了3大版本迭代,系统能力逐步完善,生态加速繁荣。一路前行,是开发者们点亮漫天星光。点滴贡献,聚沙成塔,开发者们正用代码改变世界。是梦想,激励我们一路前行。在黎明到来前,有人在迷雾中启程,有人在坎坷中奔跑,有人在未知中探索,有人在困境中坚持,有人在挫折里涅......
  • Gorm一对一,一对多,查询报错 unsupported relations for schema
    Gorm一对一,一对多,搞我半天bug标签(空格分隔):go,gorm问题:一对一,一对多,查询数据报错:unsupportedrelationsforschema代码//GoodsSpecificationAttrModel商品规格-属性表typeGoodsSpecificationAttrModelstruct{ IDint32`gorm:"co......
  • Django restframwork中使用分页及实现自定义分页
    关于为何要分页以及如何在Django+Template架构中如何使用分页,可以参考之前的文章django自定义分页类和使用总结[1]DjangoRestFramework中分页限制今天开篇我们先不讲如何使用,我们先说Django+restframework实现前后端分离项目开发时,分页功能使用的限制?缘由是之前在开发运维......