Go 1.20.3中go get与go install的差异及相关安装问题咨询
问题解答
1. go install未生成simpleGitHub二进制文件的原因
你的go install github.com/mactsouk/go/simpleGitHub命令未生成二进制文件,核心原因有两个:
- 目标子包不是可执行包:
simpleGitHub目录下没有包含main函数的.go文件(即不是package main)。Go的go install仅在编译main包时才会生成可执行二进制文件并输出到$HOME/go/bin目录;如果是库包(package XXX非main),只会将编译后的包存入模块缓存(即你看到的$Home/go/pkg/mod下的目录),不会生成bin文件。 - 未指定版本标签(模块模式要求):在Go 1.16+的模块模式下,直接使用
go install <包路径>需要明确指定版本(比如@latest、@v1.0.0),否则可能因版本解析问题导致未正确编译。你可以尝试执行go install github.com/mactsouk/go/simpleGitHub@latest再检查结果。
2. go get与go install的核心差异
- 功能定位不同:
go get:专注于下载、更新依赖模块,会自动修改当前项目的go.mod和go.sum文件,将依赖添加到项目的依赖声明中;可用于更新已有依赖的版本,或拉取新的依赖模块。go install:专注于编译并安装,针对main包会生成可执行二进制文件到$GOPATH/bin或$GOBIN目录;针对库包则仅将编译后的包存入模块缓存,不会修改当前项目的go.mod(除非需要下载缺失的依赖)。
- 执行结果不同:
go get完成后,依赖会被添加到项目的依赖列表,模块缓存中会有对应的包,但不会生成可执行文件(除非目标是main包且隐式编译)。go install针对main包会生成二进制文件,针对库包仅完成编译缓存,不修改项目依赖声明(除非依赖缺失需要下载)。
3. go.sum文件出现两条相同模块记录的原因
go.sum中的两条记录分别对应模块的不同校验维度:
- 第一条
github.com/mactsouk/go v0.0.0-20180603081621-6a282087f7bd h1:...:是整个模块的校验和,用于验证下载的模块所有文件的完整性。 - 第二条
github.com/mactsouk/go v0.0.0-20180603081621-6a282087f7bd/go.mod h1:...:是模块中go.mod文件的单独校验和,用于验证模块依赖声明文件的完整性。
Go需要这两个校验和来双重确保模块的真实性和完整性,避免下载的模块或其依赖声明被篡改,因此会同时保留这两条记录。
内容的提问来源于stack exchange,提问作者DDave
相关产品推荐
相关产品推荐

