了解golang包管理 | 豆包MarsCode AI 刷题

85 阅读3分钟

Preface

这篇文章仅仅是带大家了解一下go包、管理历史、几个常见(GOPATH在下一篇详细说)的环境变量

更像科普,仅仅是了解

下一篇我会在我的视角下介绍关于GOPATH前后两个版本以及Go SDK自带的go get/go install到底区别在哪里

在Go语言中,“子包”指的是相对于当前包的下一级或多级的包,实际上没有严格的层级限制,只要是当前项目内的,都可以被视为子包。所以,不管是下一级还是下二级,甚至更深层级的包,都可以算作是当前包的子包。

标准库Standard Library、第三方包Third-party Packages、组织内其它包Internal Organization Packages和当前包的子包Sub-packages in Current Project 4种。

Golang包管理发展

一般编程语言都会提供依赖库管理工具,例如python的pip、node.js的npm,java的maven,rust的cargo。

go modules是"Russ Cox"(Go语言核心开发团队人员之一)推出来的,发布于Go1.11。

“依赖包”指的是项目中引用的外部库或模块。

起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下。

所有项目只能使用同一个版本的依赖包

假设你有两个项目 projectAprojectB,分别依赖 github.com/some/package 的不同版本。GOPATH 模式下,由于每个包在 GOPATH/src 下只能有一个版本,你不得不在两个项目中选择一个公共的版本。

当然,这显然不能满足需求,因为确实有的项目需要使用一个包的1.0.0版本,另一个项目需要这个包的2.0.0版本。

为了实现不同项目不同版本的管理,提出了go modules

相关环境变量

image-20241128095312429.png

GOROOT

就是Go SDK bin目录的地方,换句话说,你安装go的时候,注意不是编译器或IDE,是go官方下载的东西

GOVERSION

当前电脑中运行的go版本,可以使用go version直接查看电脑go版本

image-20241128095732797.png

GO111MODULE

这个环境变量是用来控制"Go Modules"的开关的,"GO111MODULE"中的111,就是Go1.11发布时提出go module的意思。

 参数:
     auto:
         只在项目包含了go.mod文件时启动go modules,在Go1.13版本中是默认值。
     on:
         无脑启动Go Modules,推荐设置,Go1.14版本以后的默认值。
     off:
         禁用Go Modules,一般没有使用go modules的工程使用。

我现在使用的Go版本是1.22.4,默认GO111MODULE=on

GOPROXY

proxy 代理

可能有些小伙伴使用不了魔法,或者说单纯的想快一些,怎么办呢?设置go的代理

GOPROXY的默认值是"https://proxy.golang.org,direct"

由于某些原因国内无法正常访问该地址,所以我们通常需要配置一个可访问的地址。

目前社区使用比较多的有两个"https://goproxy.cn""https://goproxy.io"

 设置GOPAROXY的命令如下:
 go env -w GOPROXY=https://goproxy.cn,direct

GOPROXY允许设置多个代理地址,多个地址之间需使用英文逗号","分隔。最后的"direct"是一个特殊指示符,用于指示Go回源到源地址去抓取(比如"GitHub"等)。

当配置有多个代理地址时,如果第一个代理地址出错了,Go会自动尝试下一个代理地址,当遇见"direct"时触发回源,也就是回到源地址去抓取。