GOPATH

参考文章

gopath 的工程结构如下:

  1. |- src
  2. |- pkg
  3. |- bin
  • src:你的源码,src 下的每个目录就相当于是 java 中的包名
  • bin:go buildgo installgo get 等命令产生的二进制可执行文件存放目录
  • pkg:上面 bin 中的这些命令产生的缓存文件会存储在这里

所以:由此看来,gopath 就分为全局和项目级,gopath 是通过环境变量指定的。

GOPATH 的作用:

  • 它类似一个工程,也就是 workspace,有工程就有第三方的依赖包等,那么这些第三方的依赖包也会存在该 gopath 下。
  • 项目自己执行的打包、编译等产生的信息也会在这个 gopath 下

所以:当你有多个项目开发时,就很痛苦了,而且还没有版本管理的概念。那么此时可以使用 go v1.11 官方出品的依赖管理工具 go mod 来替代项目级的 gopath

go mod

参考文章

命令 作用
go mod download 下载依赖包到本地(默认为 GOPATH/pkg/mod 目录)
go mod edit 编辑 go.mod 文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹,创建 go.mod 文件
go mod tidy 增加缺少的包,删除无用的包
go mod vendor 将依赖复制到 vendor 目录下
go mod verify 校验依赖
go mod why 解释为什么需要依赖

如何使用?假设这里需要开发一个 app 项目,首先需要在 gopath 目录外 任意目录创建一个 app 目录,也就是 app 项目

:::info 为什么需要在 gopath 目录外?
使用 go mod,你可以想象成原来的 gopath 就是 gradle、maven 的工作目录,一些第三方依赖会下载到 gopath 中,那么项目级的 gopath 也不需要了,直接用系统级的 gopath 就行了,就把系统级的 gopath 当成是 maven、gradle 工具目录 ::: 一个 go mod 管理的项目如下所示:

  1. |- app
  2. |- go.mod
  3. |- 其他 go 文件可以随意组织

这里最主要的就是 go.mod 的使用,go.mod 提供了 module、require、replace 和 exclude 四个命令:

  • module 语句指定包的名字(路径);
  • require 语句指定的依赖项模块;
  • replace 语句可以替换依赖项模块;
  • exclude 语句可以忽略依赖项模块。
  1. module ch02 // 该项目的名字
  2. go 1.16 // 使用的 go 版本
  3. // 依赖的模块
  4. require github.com/gorilla/mux v1.8.0
  • go mod init:一个新项目需要生成 go.mod 文件时,可以使用此命令
  • go mod download:当你拿到一个新项目需要安装依赖时,可以使用此命令