学习了Go了解到,在刚安装完Go后需要配置GOPATH,而GOPATH具体是用来干什么的,我们又为什么需要GOPATH呢?这篇博客将用来记录对这两个问题的理解。

头图来源:w - Alcxome - pixiv


9.16启

What is GOPATH?

首先是关于GOPATH的解释,GOPATH这个环境变量指定了我们Go项目的工作区,我们就是在这里编写Go程序,这个工作区的结构如下:

workspace
   |--src
   |--pkg
   |--bin

其中src就是我们源代码存放的目录,pkg则是golang编译包时生成.a文件存放的路径,bin毫无疑问就是可执行文件存放的路径了。
我们在编译main模块时会得到一个对应的可执行文件,它将被存放于bin目录,而如果编译的是个库文件,则会被存放于pkg目录。也就是说,三个目录,一个存放源代码,一个存放编译后的可执行文件,一个存放编译后的库文件。

Why we need GOPATH?

在文件系统中,Go的代码包是与目录一一对应的(一个目录下的所有Go文件都应属于同一个包),这些代码包也可以有子包。其中$GOPATH/src就是一个代码包的导入路径,至于为什么不像C一样使用相对路径导入,我的理解是C中导入的相对路径是被导入文件相对于当前文件的相对路径,这样一来项目一大导入路径就会变得复杂且不够统一。Go中设定了一个统一的GOPATH作为工作目录,并使用$GOPATH/src作为导入包的绝对路径,使得导入包无需计算相对路径,只要通过包在$GOPATH/src目录下存放的路径就能用这个路径来导包,简单且方便,易于项目管理。
以上是我的个人理解,也许会有表述不准确的地方。


9.20更新

在Go1.11版本之后Go采用了go module来管理包依赖,且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。项目所需要的依赖仅需在go.mod文件中声明,之后就可根据go.mod中所添加的依赖使用go mod download命令将依赖下载到本地缓存(一般为$GOPATH/pkg/mod)下。使用go module来管理包依赖意味着我们无需将项目建在GOPATH下,反而可以建在任意位置,只需在项目根目录下声明go.mod文件即可。相比之前确实合理了许多。
关于是否启用go module来管理Go包依赖需在go env中进行设置,其中

GO111MODULE=off: 不使用 modules 功能。
GO111MODULE=on: 使用 modules 功能,不会去 GOPATH 下面查找依赖包。
GO111MODULE=auto: Golang 自己检测是不是使用 modules 功能。

go Module常用命令

go mod init  # 初始化go.mod
go mod tidy  # 更新依赖文件
go mod download  # 下载依赖文件
go mod vendor  # 将依赖转移至本地的vendor文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖
Last modification:October 2nd, 2021 at 07:46 pm
If you think my article is useful to you, please feel free to appreciate