这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
线程 vs 协程
- 协程:用户态,轻量级线程,栈KB级别。
- 线程:内核态,线程跑多个协程,栈MB级别。
Go 依赖管理演进
GOPATH -> Go Vendor -> Go Module
GOPATH
- 项目代码直接依赖 src 下的代码。
- go get 下载到最新版本的包到 src 目录下。 问题: 无法实现 package 的多版本并发控制。
Go vendor
- 项目目录下增加 vendor 文件,所有依赖包副本形式放在 $ProjectRoot/vendor
- 依赖寻址方式: vendor => GOPATH 问题:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译错误。
Go Module
- 通过 go.mod 文件管理依赖包版本。
- 通过 go get/go mod 指令工具管理依赖包。
依赖配置 version
语义化版本 :V{MAJOR}.{MINIOR}.{PATCH},例如:v1.3.0 基于 commit 伪版本 :
vx.0.0-yyyymmddhhmmss-abcdefgh1234
依赖配置 indirect
A->B->C
A直接依赖于B,间接依赖于C
依赖配置 incompatible
-
主版本2+模块会在模块路径增加/vN 后缀
-
对于没有 go.mod 文件并且主版本2+的依赖,会+incompatible
依赖分发-回源
问题:
- 无法保证构建稳定性(增加修改删除软件版本)
- 无法保证依赖可用性(删除软件)
- 增加第三方压力(代码托管平台负载问题)
依赖分发-Proxy
缓存依赖的代码和版本,稳定可靠。
项目测试
- 单元测试
- Mock测试
- 基准测试
分层结构
- 数据层:数据 Model ,外部数据的增删改查。
- 逻辑层:业务 Entity,处理核心业务逻辑输出。
- 视图层:视图 view,处理和外部的交互逻辑。