这是我参与「第五届青训营 」伴学笔记创作活动的第2天
一、本堂课内容
- 锁Lock
- 线程同步 WaitGroup
- Go Module
- 单元测试概念和规则
- Mock测试
- 基准测试
- 项目实战
二、详细知识点
1. goroutine
在Go里,每一个并发执行的活动称为goroutine,是一种用户态线程,也称为协程,其创建和切换无需进入操作系统内核,栈一般为KB大小。
f()
go f() // 新建一个调用f()的goroutine
2. channel
通道是可以让一个goroutine发送特定值到另一个goroutine的通信机制,提倡通过通信共享内存而不是通过共享内存而实现通信。
可以使用make函数来创建一个通道,make(chan 元素类型,[缓冲大小]):
ch := make(chan int) // 无缓冲通道
ch := make(cham int, 2) // 有缓冲通道
通道有发送和接收两个主要操作,用<-操作符书写。
ch <- x // 发送
x = <- ch // 接收
关闭通道
close(ch)
3.lock
互斥锁sync.Mutex
声明
var mu sync.Mutex
加锁
mu.Lock()
解锁
mu.Unlock()
4.WaitGroup
WaitGroup对象内部有一个计数器,有Add(n), Done()来控制计数器数量,Wait()会阻塞代码运行直到计数器值减到0
5.Go Module
- 通过 go.mod 文件管理依赖包版本
- 通过 go get/go mod 指令工具管理依赖包
依赖管理三要素:
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
6.单元测试
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
7.基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
三、实践练习例子
实现社区话题页面
- 展示话题和回帖列表
- 实现本地web服务
- 话题和回帖数据用文件存储