go env命令,可以查询到GO相关的环境变量 在 Golang 中,有两个概念非常容易弄错,第一个就是 GoPath,第二个则是 GoModule,特别是随着Go版本的更新,好多文档没有及时更新,导致初学者对两者模糊不清,一头雾水。 什么是 GoPath GoPath 是 Golang 的工作空间,所有的 Go 文件,都需要放在 GoPath 下的 src 目录下才能够编译运行,所以我提议不要直接配置全局的 GoPath 目录,否则会非常难以管理所有的 Golang 项目。 我们在项目中使用第三方类库的时候,使用go get命令去下载安装的第三方类库的包,而拉取下来的包就会直接下载到 GoPath 目录下的 src 中。GOPATH本身是不区分项目的,代码中任何import的路径均从GOPATH为根目录开始; 不区分依赖项版本 当有多个项目时,不同项目对于依赖库的版本需求不一致时,无法在一个GOPATH下面放置不同版本的依赖项。典型的例子:当有多项目时候,A项目依赖C 1.0.0,B项目依赖C 2.0.0,由于没有依赖项版本的概念,C 1.0.0和C 2.0.0无法同时在GOPATH下共存,解决办法是分别为A项目和B项目设置GOPATH,将不同版本的C源代码放在两个GOPATH中,彼此独立(编译时切换),或者C 1.0.0和C 2.0.0两个版本更改包名。无论哪种解决方法,都需要人工判断更正,不具备便利性。 并且不同的 GoPath 都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用大量的磁盘空间。 依赖项列表无法数据化 在项目中没有任何语义化的数据可以知道当前项目的所有依赖项,需要手动找出所有依赖。对项目而言,需要将所有的依赖项全部放入源代码控制中。如果剔除某个依赖,需要在源代码中手工确认某个依赖是否剔除。 为了解决这所有的问题,Golang 最终引入了 GoModule 的概念。 什么是 GoModule GoModule 是 Golang 在 1.11 版本初步引入的概念,在 1.12 版本中正是开始使用,所以如果需要使用 GoModule,那么需要保证你的 Golang 的版本在 1.12 或以上。 另外需要说一下,Golang1.11 和 1.12 版本虽然已经引入了 GoModule 的概念,但是 GoModule 是默认不开启的,如果需要开启,那么需要配置一个环境变量:GO111MODULE=on,默认是off。 而在 Golang1.13 及以上的版本中,GoModule 的默认配置为 auto,即 GoModule 会通过你的目录下是否有 go.mod 文件来判断是否开启 GoModule。所以 Golang1.13 + 的版本中我们就不需要配置 GO111MODULE 属性了。 那么究竟什么是 GoModule? Go Modules是语义化版本管理的依赖项的包管理工具;它解决了GOPATH存在的缺陷,最重要的是,它是Go官方出品。 说得直白一下,GoModule 就是一个用来取代 GoPath 的 Golang ...