学习了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 # 校验依赖