Go 小册

Go小册

安装

官网

最快捷的方法就是去官网 https://golang.org/ 下载对应的安装包进行安装,不过官网偶尔会访问不了,因此,也可以通过镜像网站进行下载。

Go Module 加速镜像

以下是几个速度不错的提供者:

设置代理

类 Unix

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启用 Go Modules 功能
go env -w GO111MODULE=on

# 配置 GOPROXY 环境变量,以下三选一

# 1. 七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct

# 2. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

# 3. 官方
go env -w GOPROXY=https://goproxy.io,direct

确认一下:

1
2
go env | grep GOPROXY
GOPROXY="https://goproxy.cn"

Windows

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启用 Go Modules 功能
$env:GO111MODULE="on"

# 配置 GOPROXY 环境变量,以下三选一

# 1. 七牛 CDN
$env:GOPROXY="https://goproxy.cn,direct"

# 2. 阿里云
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/,direct"

# 3. 官方
$env:GOPROXY="https://goproxy.io,direct"

基础 Go 命令

初始化

1
go mod init github.com/lwshen/module-mode

升级/降级依赖

查看所有可用版本:

1
go list -m -versions github.com/sirupsen/logrus

方式一:

1
go get github.com/sirupsen/logrus@v1.7.0

方式二:

1
2
go mod edit -require=github.com/sirupsen/logrus@v1.7.1
go mod tidy

删除依赖

go build 不会去删除依赖,因此需要 go mod tidy 对依赖进行整理。

1
go mod tidy

使用 vendor

如果在内部网络不方便使用 Go Module 进行构建时,依旧可以使用 vendor 进行本地的依赖管理。可以通过以下命令创建 vendor:

1
go mod vendor

如果我们要基于 vendor 构建,而不是基于本地缓存的 Go Module 构建,我们需要在 go build 后面加上 -mod=vendor 参数。

在 Go 1.14 及以后版本中,如果 Go 项目的顶层目录下存在 vendor 目录,那么 go build 默认也会优先基于 vendor 构建,除非你给 go build 传入 -mod=mod 的参数。

Go Module 构建模式

语义版本导入机制

Go 语义版本号

语义版本号分成 3 部分:主版本号 (major)、次版本号 (minor)和补丁版本号 (patch)。

Go Module 规定:如果同一个包的新旧版本是兼容的,那么它们的包导入路径应该是相同的

例如:v1.8.1能够兼容老版本的v1.8.0和v1.7.0,而v2.0.0的包根据语义版本的规则,则与v1.8.1和v1.7.0不兼容。

因而,我们可以同时依赖一个包的两个不兼容版本:

1
2
3
4
import (
"github.com/sirupsen/logrus"
logv2 "github.com/sirupsen/logrus/v2"
)

最小版本选择原则

复杂依赖关系的版本原则

在这张图中,myproject 有两个直接依赖 A 和 B,A 和 B 有一个共同的依赖包 C,但 A 依赖 C 的 v1.1.0 版本,而 B 依赖的是 C 的 v1.3.0 版本,并且此时 C 包的最新发布版为 v1.7.0。

其实,当前存在的主流编程语言,以及 Go Module 出现之前的很多 Go 包依赖管理工具都会选择依赖项的“最新最大 (Latest Greatest) 版本”,对应到图中的例子,这个版本就是 v1.7.0。

Go 会在该项目依赖项的所有版本中,选出符合项目整体要求的“最小版本”。这个例子中,C v1.3.0 是符合项目整体要求的版本集合中的版本最小的那个,于是 Go 命令选择了 C v1.3.0,而不是最新最大的 C v1.7.0。

Go 初始化顺序

Go 包的初始化顺序可以概括为以下三点:

  1. 依赖包从main开始按照”深度优先“的次序进行初始化
  2. 每个包内按照”常量->变量->init函数“的顺序进行初始化
  3. 每个包内的可以有多个init函数,按照从上往下的顺序进行自动调用

参考文章


Go 小册
https://slw.im/2022/01/go-book/
作者
Ryo Shen
发布于
2022年1月21日
许可协议