这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。
本节课程主要分为四个方面:
- 并发编程
- 依赖管理
- 单元测试
- 项目实战
1. 从go并发编程视角了解Go的高性能本质
并发:多线程程序在一个核的CPU上运行
并行:多线程程序在多个核的CPU上运行
GO实现了一个高效的调度模型,可以充分发挥多核优势,高效运行。
协程:goroutine,用户态,轻量级线程,栈KB级别;
线程:比较昂贵的系统资源,内核态,线程跑多个协程,栈MB级别。
协程间通信(CSP):
Go提倡通过通信共享内存而不是通过共享内存而实现通信
通道:channel,类似于传输队列,先入先出
通过共享内存通信需要互斥量加锁
通道:channel
make(chan 元素类型,[缓冲大小])
无缓冲通道:make(chan int),同步通道
有缓冲通道:make(chan int, 2)
WaitGroup:实现并发任务的同步,因为time.Sleep方法并不能确定子协程结束的时间
Add(delta int):计数器+delta
Done():计数器-1
Wait():阻塞直到计数器为0
2. 依赖管理
环境变量$GOPATH:
bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码
GoVendor:项目目录下增加vendor文件夹,所有依赖包副本形式放在$ProjectRoot/vendor下
依赖寻址:vendor -> gopath
Go Module:通过go.mod文件管理依赖包版本,通过go get/go mod 指令工具管理依赖包。
依赖管理三要素:
1、 配置文件,描述依赖 go.mod
2、 中心仓库管理依赖库 Proxy
3、 本地工具 go get/mod
indirect:间接依赖
incompatible:不兼容的
工具:Go mod
go mod init:初始化,创建 go.mod文件
go mod download:下载模块到本地缓存
go mod tidy:增加需要的依赖,删除不需要的依赖
3. 测试
回归测试:QA同学手动在终端回归场景来测试
集成测试:自动化的在功能维度对暴露的接口进行回归测试
单元测试:
规则:
l 所有测试文件以_test.go结尾;
l 测试函数:func TestXxx(*testing.T)
l 初始化逻辑放到TestMain中:func TestMain(m *testing.M){
//测试前:数据装载、配置初始化等前置工作
code := m.Run()
//测试后:释放资源等收尾工作
os.Exit(code)
}
代码覆盖率:评估单元测试
幂等:重复执行一个case结果都是一样的
4. 项目实战
4.1 需求描述
4.2 需求用例
1、浏览消费用户
Topic:话题
PostList:帖子
4.3 E-R图
4.4 分层结构
视图层相当于对返回数据做一层包装。