这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
一、Go语言进阶-并发编程
0 并发 vs 并行
并发:多线程程序在一个核的cpu上运行(时间片的切换);
并行:多线程程序在多个核的cpu上运行
1 Goroutine
协程:用户态,轻量级线程,栈KB级别;
线程:内核态,线程跑多个协程,栈MB级别;
2 CSP
Go提倡通过通信共享内存,而不是通过共享内存而实现通信;
3 channel
channel是一种引用类型;
make(chan 元素类型,[缓冲大小])
无缓冲通道:make(chan int)
,又称为同步通道;
有缓冲通道:make(chan int, 2)
4 并发安全 lock
不带锁的多协程并发可能会出问题;
避免对共享内存做非并发安全的读写操作;
5 WaitGroup
内置计数器,Add,Done,Wait;
开启协程+1,执行结束-1,主协程会阻塞到计数器为0;
二、依赖管理
Go的依赖管理演进
- GoPath无法实现package的多版本控制;
- GoVendor为每个项目引入一份依赖包的副本;但无法控制依赖的版本;
- GoModule
GoModule三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
三、测试
单元测试
- 回归测试-->集成测试-->单元测试
覆盖率逐渐变大,成本逐渐降低
单元测试的规则 :
- 测试文件以
_test.go
结尾 - 函数名为
func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
func TestMain(m *testing.M) { // 测试前:数据装载、配置初始化等前置工作 code := m.Run() // 测试后:释放资源等收尾工作 os.Exit(code) }
单元测试-覆盖率
- 一般覆盖率:50~60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
四、项目实战
1 需求描述
- 展示话题(标题,文字描述)和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储
2 分层结构
- 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图view,处理和外部的交互逻辑