这是我参与 [第三届青训营 -后端场]笔记创作活动的第3篇笔记 通信实现共享内存(channel)
共享内存实现通信(临界区)
线程
协程
协程与通道通信
并发安全(共享内存实现通信) 数据映太
权限控制
sleep(阻塞控制)
等待队列
add
done
wait
sync
lock
withgroup
依赖管理三要素
配置文件,描述依赖-> go.mod
module 版本号
1.依赖配置-go.mod
模块路径:标识模块 定位仓库
标识原生库版本号: go的原生库
单元依赖:定位仓库的某一个版本,某一次提交
2.依赖配置-version
语义化版本 大(之间可以不兼容):中(新增函数,功能):小(代码,bug修复)
V1.3.0
V2.3.0
基于commit伪版本
语义化版本+时间戳+hash校验码
3.依赖配置-indirect
A依赖B,B依赖C A直接依赖B(不加) A间接依赖C(加indirect)
4.依赖配置-incompatible
主版本2+模块会在模块路径加/vN后缀
没有go.mod文件(老模块)且主版本2+的依赖,会+incompatible
题目:选择最低的兼容版本
中心仓库如何管理依赖库 proxy
5.依赖分发-回源(第三方源站下载)
直接从第三方仓库拉代码
- 作者改版本
proxy:缓存内容
- 从 go proxy拉取代码
goproxy:url列表
本地工具 go get/mod
测试
覆盖率
回归测试
手动到场景(人工)
集成测试
自动化测试(某个接口,功能维度)
单元测试(函数,模块...)
开发者对单独模块做测试
- 保证质量(增加新模块)
- 提升效率(找bug效率)
单元测试-规则
Test开头
单元测试-例子
单元测试-运行
go test ...
单元测试-代码覆盖率
加上 --cover 可选项
函数行数的执行占比(3条,用两条 覆盖率为66.7%)
函数小利于单元测试覆盖度提升
单元测试-依赖(依赖组件很复杂,不可能单一函数)
目标:
幂等:每次结果一样
稳定:单元测试相互隔离(任何时间,函数独立运行)
直接测试不稳定,无法保证每次结果一样
mock机制
单元测试-文件处理(外部依赖)
文件被篡改后,无法测试.(mock处理,让测试不依赖于文件)
基准测试-例子(性能分析)
服务器负载均衡场景
随机选择服务器(rand.Intn(10))
基准测试-运行
Benchmark开头
全局锁 降低 多协程的(性能)执行速度? 比单协程低?
b.RunParallel
基准测试-优化(fastrand())
项目实践
需求设计
展示文字
展示回帖列表
实体
topic结构体
标题
文字
id
创建时间
回帖列表
帖子id
主题id
回帖内容
回帖时间
两个实体一对多
分层结构
数据层:处理数据(向上提供数据)
透明:上一层无需关心底层实现
逻辑层:提供实体
视图层:json格式化结果.提供给接口
1:27:40
代码开发
测试运行
实战
Repository
初始化话题数据索引
初始化回帖数据索引
实现查询(sync.Once 单例模式)