这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
关于依赖
依赖就是指用户在开发过程中使用的非本人编写的代码函数库,类似 python 中的 import xxx ,不过由于 go 是一门编译型语言,所以使用依赖都是需要源代码然后编译进程序的,所以对于一门编译型语言来说,如何管理依赖是一个重要的问题,对依赖的管理主要就是同一个依赖的不同版本问题,go 的依赖管理方案有两次迭代
第一次迭代是 GOPATH->Go Vendor,利用不同项目使用依赖的副本放在项目文件夹下,解决了 GOPATH 所有项目都使用 src 目录下同一个版本的依赖导致的更新依赖后出现有些项目不兼容的问题
第二次迭代是 Go Vendor->Go Module,Go Vender 的方案还是会有问题,当一个项目使用其他多个项目的时候,后者之间会存在依赖冲突,如果只使用当前项目文件夹中的依赖副本,还是会有问题
而 Go Module 就解决了这个问题,Go Module 的方案是通过 go.mod 文件来管理依赖包的版本,通过 go get 或者 go mod 指令来管理依赖包,go.mod 文件中包含了很多重要信息,require 后面跟的就是项目需要的依赖和对应的版本号了,其中有注释indirect 的就是指间接依赖,就是指依赖的依赖,+incompatible 是指可能由于版本问题不兼容的依赖
对于版本号也是有考究的,版本号的第一个数字是大版本,大版本之间可能会有些函数做出删减,会出现不兼容的问题,第二个数字是小版本,小版本之间是向下兼容的,第三个数字是补丁号,当出现依赖冲突的时候,go 会贪心地选择可以运行的最低兼容版本,比如说你要用 v1.5 和 v1.4,因为 v1.5 向下兼容,所以 go 就会采用 v1.5 版本
依赖下载通常会从 github 上下载,但是众所周知,国内的网速非常感人,所以我们通常需要配置 Proxy 来下载,一般都会在配置文件里
export GOPROXY=https://goproxy.cn
你也可以多来几个 Proxy
export GOPROXY="https://proxy1.cn,https://proxy2.cn,direct"
顺序是从前往后检索的,好像也可以不配置环境变量来配置 GOPROXY
$ go env -w GOPROXY=https://goproxy.cn,direct
使用 Go Modules 是需要告诉 go 的,GO111MODULE 这个环境变量可以设置成 off on auto ,开启之后 go 会忽略 GOPATH 和 Go vendor 的风格,只根据 go.mod 下载依赖
go get
$ go get example.org/pkg
可以下载依赖,这样下载是默认最新版本的,也可以下载指定版本
$ go get example.org/pkg @v1.1.2
go mod
$ go mod init # 创建初始 go.mod 文件
$ go mod download # 下载依赖到本地缓存
$ go mod tidy # 优化依赖
虽然还没正式开始大量使用依赖,但是总体感觉比 java 好太多,我就是由于不理解 java 的编译过程,再加上 cli 上开发 java 的例子太少,好像是可以用 maven 来帮助构建项目目录,但我还是比较抗拒这些懒人包工具的,网上找 vim 如何写 java,大多数文章就写 java 的 lsp,主要还是会把 vim 当成 ide 使用,我就受不了那样,所以我就没学进 spring,虽然装了 IDEA,但是还是等 go 学成之后再去学 spring 框架吧,感觉后端的工作其实挺傻的(?