什么是GoPath?

GoPath是Golang的工作空间,所有的Go文件,都需要放在GoPath下的src目录下才能够编译运行,所以我提议不要直接配置全局的GoPath目录,否则会非常难以管理所有的Golang项目。

在项目中使用第三方类库的时候,可以使用go get命令从网下直接拉去第三方类库的包,而拉取下来的包就会直接下载到我们的GoPath目录下的src包下。

但这样就导致了一个问题,我们自己的Golang代码,和第三方的Golang文件混在了一起,这对于我们管理Golang项目的包显然是非常麻烦的,而且每个如果项目都需要「同样的依赖」,那么我们就会在不同的GoPath的src中下载大量重复的第三方依赖包,这同样会占用大量的磁盘空间。

我们给不同的项目设置不同的GoPath,优点非常明显:

便于管理项目,每个项目都是不同的GoPath,这对于我们管理多个Golang项目而言,能够非常清晰的处理项目结构。如果我们把所有项目都放在同一个GoPath的src包下,那么项目的结构就会变得非常混乱,难以管理。

但是当我们需要依赖第三方的包的时候,不同的项目设置不同的GoPath的缺点也非常明显:

  1. 第三方依赖的包和我们自己的Golang包混在一起,会给我们的项目文件管理带来一定的麻烦。
  2. 不同的GoPath都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用我们大量的磁盘空间。

所以,究竟是设置一个GoPath目录,解决依赖重复的问题,还是设置不同的GoPath目录,解决Golang项目结构混乱的问题,这是一个有争议性的问题。

为了解决这所有的问题,Golang最终引入了GoModule的概念。

什么是GoModule?

我们之前说过,所有的Golang的文件,都需要放在GoPath目录下才能进行正确的编译和运行,而有了GoModule之后,那么我们就可以把文件放在GoModule目录下,而放在GoModule目录下的Golang文件,也可以正确地编译运行。

说直白点,可以理解GoModule为Java中的Maven

  • GoPath用来存放我们从网上拉取的第三方依赖包
  • GoModule用来存放我们自己的Golang项目文件

现在GoModule和GoPath齐力合作,当我们自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件来引用GoPath目录src包下的第三方依赖即可。

怎么使用GoModule?

CMD创建

很简单,我们直接使用go mod init 模块名称命令对目录进行初始化操作,即可将这个目录设置为GoModule目录。
我们在F:\GoModule目录下创建一个文件夹,名字为:go_module
然后通过cmd命令提示符进入该目录,执行go mod init 模块名称初始化命令

在这里插入图片描述

Golang创建

更简单了,都懒得写了,懂的都懂哈!

go.mod

当初始化命令执行完毕之后,会在go_module目录下生成一个go.mod文件,该文件就是用来引入GoPath目录下的第三方依赖的文件。

1
2
3
module GolangLearning

go 1.17

当我们需要引入GoPath目录下的第三方依赖包的时候,只需要在go.mod目录下添加依赖名称,GoModule就会自动帮我们把第三方依赖包下载到GoPath目录下。

例如下面的go.mod文件:

1
2
3
4
5
6
7
8
module GolangLearning

go 1.17

require (
github.com/astaxie/beego v1.12.1
github.com/go-sql-driver/mysql v1.5.0
)

我们在这个go.mod文件中引入了两个依赖,分别是:beego框架 v1.12.1版本mysql驱动 v1.5.0版本