- 这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1. 重点内容
- Go语言并发编程
- 依赖管理
- 系统测试
- 项目实战
2. 知识点
2.1 并发编程
-
Goroutine- 线程:用户态,轻量级线程,栈MB级别
- 协程:内核态,线程跑多个协程,栈KB级别
-
CSP(Communicating Sequential Process)-
通过通信共享内存
-
通过共享内存实现通信
Go语言提倡通过通信共享内存。
GO的协程间的通信都是在同一个进程内进行,所以没有必要跟进程间通信做比较,只需要跟线程间通信做比较即可。
-
-
Channel- 构造方法:
make(chan 元素类型,[缓冲大小])。定义缓冲大小为有缓冲通道、实现异步通信,否则为无缓冲通道、实现同步通信。
- 构造方法:
-
并发安全 Lock
采用锁机制来保证同步和数据的安全性。
// 声明锁 var lock sync.Mutex // 获取锁 lock.Lock() // 释放锁 lock.Unlock() -
WaitGroup计数器,开启线程+1,执行结束-1。主线程阻塞,直到计数器为0。
Add(delta int) // +delta Done() // -1 Wait() // 阻塞直到计数器为0
2.2 依赖管理
-
GOPATH- 项目代码直接依赖
src下的源码。使用go get下载最新的包到src下 - 弊端:无法实现package的多版本控制
- 项目代码直接依赖
-
Go Vendor- 通过每个项目引入一份依赖的副本,解决多个项目需要同一个package依赖的冲突问题
- 弊端:无法控制依赖的版本。更新项目可能会导致依赖冲突
-
Go Module- 通过
go.mod文件管理依赖包版本 - 通过
go get/go mod指令管理依赖包
- 通过
2.3 系统测试
从单元测试到回归测试,覆盖率逐层变小,成本逐渐升高。
-
单元测试
-
单元测试包括输入、测试单元、输出以及校对
-
用最后的校对来保证代码的功能与预期相符
-
可以保证质量,也可以提升效率
- 实际项目中,一般要求覆盖率在50%~60%,对于资金型要求可能达到80%
- 测试分支相互独立,全面覆盖
- 测试单元粒度足够小,函数单一职责
-
-
Mock测试- 为一个函数/方法打桩
- 摆脱本地文件的束缚和依赖
-
基准测试
- 对一类测试对象的某项性能指标进行定量的和可对比的测试
3. 实战练习
-
需求分析
- 展示话题和回帖列表
-
组件工具
Gin高性能go web框架
-
Repositoryvar ( topicIndexMap map[int64]*Topic postIndexMap map[int64][]*Post )- 初始化话题数据索引
- 根据查询key获得map中的value
-
Service-
定义实体
Topic和PostList"参数校验" --> "准备数据" --> "组装实体"
-
话题信息和回帖信息并行处理
-
-
Controller- 构建
View对象 - 处理业务错误码
- 构建
-
Router- 初始化数据索引
- 初始化引擎配置
- 构建路由
- 启动服务
-
运行
go run server.go运行测试