go get 和 go install 对比介绍

 更新时间:2023年04月19日 09:04:05   作者:Light_Tree  
go install和go get都是Go语言的工具命令,但它们之间有一些区别。go get:用于从远程代码存储库(如 GitHub)中下载或更新Go代码包。go install:用于编译并安装 Go 代码包,本文go get和go install对比介绍的非常详细,需要的朋友可以参考一下

一、问题背景

安装Go库db2struct时,使用go get命令执行

go get ``github.com/Shelnutt2/db2struct/cmd/db2struct

执行db2struct -h报错:

zsh: command not found: db2struct

改为go install命令执行

go install ``github.com/Shelnutt2/db2struct/cmd/db2struct

后成功执行db2struct -h,同时ls $GOPATH/bin也看到了可执行文件db2struct

二、原因探究

(一)命令定义和区别

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 代码包$GOPATH/src$GOPATH/bin
go install编译并安装 Go 代码包无需下载自身代码,$GOPATH/src 用于依赖包的查找GOPATH/bin或GOPATH/bin 或 GOPATH/bin或GOPATH/pkg

(二)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 命令则可以避免这些问题,下面列举了几种常见情况:

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

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

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

命令功能编译效果应用场景
go get下载或更新 Go 代码包并生成可执行文件可能由于版本或编译环境的不同,生成的可执行文件无法运行或出现其他问题需要快速下载和安装指定版本的 Go 代码包,如果生成的可执行文件无法运行,则需要使用 go install 命令重新编译
go install编译并安装 Go 代码并生成可执行文件或库在当前环境下重新编译源代码并生成可执行文件或库,能够更加稳定地运行代码包需要在当前环境下重新编译 Go 代码并生成二进制文件,需要避免由于版本不兼容、编译环境不同或依赖关系复杂性导致的编译错误和生成的可执行文件无法运行的问题。

到此这篇关于go get 和 go install 对比介绍的文章就介绍到这了,更多相关go get和go install对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang判断key是否在map中的代码

    golang判断key是否在map中的代码

    这篇文章主要介绍了golang判断key是否在map中的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang1.23版本之前 Timer Reset方法无法正确使用

    golang1.23版本之前 Timer Reset方法无法正确使用

    在Go 1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避免潜在的问题,然而,这在实际代码中难以实现,因为设置定时器状态和发送channel的操作并不是原子的,在某些情况下,这会导致timer在不应该触发时提前触发
    2025-01-01
  • 详解Golang并发控制的三种方案

    详解Golang并发控制的三种方案

    本文主要介绍了详解Golang并发控制的三种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • go使用支付宝沙箱实现支付宝支付的操作步骤

    go使用支付宝沙箱实现支付宝支付的操作步骤

    支付宝沙箱支付是支付宝提供的一个测试环境,用于开发者在不影响真实交易的情况下进行支付接口的开发和调试,本文给大家介绍了go使用支付宝沙箱实现支付宝支付的操作步骤,文中有详细的代码示例和图文供大家参考,需要的朋友可以参考下
    2024-03-03
  • Go1.20最新资讯go arena手动管理内存鸽了

    Go1.20最新资讯go arena手动管理内存鸽了

    由于过于繁杂,Go 核心团队成员@Ian Lance Taylor,也表态:目前尚未做出任何决定,也不可能在短期内做出任何决定,可以认为这个提案基本鸽了,今天这篇文章就是给大家同步目前的情况
    2023-11-11
  • 解决golang 反射interface{}做零值判断的一个重大坑

    解决golang 反射interface{}做零值判断的一个重大坑

    这篇文章主要介绍了解决golang 反射interface{}做零值判断的一个重大坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 线上golang grpc服务资源泄露问题排查

    线上golang grpc服务资源泄露问题排查

    这篇文章主要介绍了线上golang grpc服务资源泄露问题排查,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Golang 实现 RTP音视频传输示例详解

    Golang 实现 RTP音视频传输示例详解

    这篇文章主要为大家介绍了Golang实现RTP音视频传输的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • GO语言操作Elasticsearch示例分享

    GO语言操作Elasticsearch示例分享

    这篇文章主要介绍了GO语言操作Elasticsearch示例分享的相关资料,需要的朋友可以参考下
    2023-01-01
  • 深入了解Golang interface{}的底层原理实现

    深入了解Golang interface{}的底层原理实现

    在 Go 语言没有泛型之前,接口可以作为一种替代实现,也就是万物皆为的 interface。那到底 interface 是怎么设计的底层结构呢?下面咱们透过底层分别看一下这两种类型的接口原理。感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-10-10

最新评论