这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
协程
协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程中可以运行多个协程,栈KB级别
协程主要通信方式
通过通信共享内存,类似生产者消费者模型
Channel 通道
make(chan 元素类型, [缓冲大小])
无缓冲通道又称为同步通道
适当的缓冲大小可以弥补生产者消费者执行速度不均衡的问题
同步
可使用lock,WaitGroup实现同步。
Go的依赖管理
1. GoPath
结构
-
bin: 项目编译的二进制文件
-
pkg: 项目编译的中间产物,加速编译
-
src: 项目源码
项目代码直接依赖于src下的源码
缺陷:无法处理项目代码依赖不同版本的情况
2. GoVendor
项目目录下新增vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
依赖寻址:有先到vendor下,再到GoPath下
问题:
- 无法控制依赖版本
- 更新项目又可能出现依赖冲突,导致编译出错。
- 本质:仍旧依赖的是源码,无法通过版本分辨
3. Go Module
通过go.mod文件进行版本管理
依赖管理三要素
1. 配置文件,描述依赖 go.mod
1. 中心仓库管理依赖库 Proxy
1. 本地工具 go get/mod
对于所需要的不同版本的依赖,go会采取最低兼容版本算法。
依赖分发-Proxy
在源站与目标之间加一层代理,代理缓存源站中的依赖
单元测试
1. 规则
所有测试文件以_test.go结尾
函数命名:func Testxx(*testing.T)
初始化逻辑放到TestMain中
2. mock
模仿真实对象行为的模拟对象
mock模拟的不是测试对象而是测试对象的依赖
Why?
- (1)提高 A 的测试覆盖率。A 依赖 B,本质上依赖的是 B 的返回结果,也就是说 B 的返回结果会影响 A 的行为。通过 mock B 我们可以构造各种正常和异常的来自 B 的返回结果,从而更充分测试 A 的行为。
- (2)避免 B 的因素从而对 A 产生影响。依赖真实的 B 去测试 A 可能有很多问题:B 的开发没有完成时无法测试 A;B 有阻塞性bug 时无法测试 A;B 的依赖 C 有阻塞性 bug 时无法测试 A;
- (3)提高 A 的测试效率。B 的真实行为可能很慢,而 B 的模拟行为是非常快的,因此可以加快 A 的测试执行速度。