这是我参与「第五届青训营 」伴学笔记创作活动的第2天。
一、本堂课重点内容:
- 语言进阶:从并发编程的视角了解Go语言高性能的本质。
- 依赖管理:了解Go语言依赖管理的演进路线
- 测试:单元测试实践,提升质量意识
- 项目实战:感受真实项目开发:项目需求》需求拆解》逻辑设计》代码实现
二、详细知识点介绍:
- 并发 vs 并行
- Go可以充分发挥多核优势,为并发而生
1.1 Goroutine 协程 - 协程是用户级、轻量级线程,线程跑多个协程
- 调用函数时函数名前加go关键字即可调用协程
1.2 CSP(Communicating Sequential Processes) - 提倡通过通信共享内存而不是通过共享内存而实现通信
1.3 Channel - make(chan 元素类型,[缓冲大小])
1.4 并发安全Lock - 加锁:lock.Lock()
1.5 WaitGroup - Add(delta int) 计数器+delta
- Done() 计数器-1
- Wait() 阻塞直到计数器为0
- 依赖管理
2.1 Go依赖管理演进
- GOPATH >> Go Vendor >> Go Module
2.1.1 GOPATH - bin:项目编译生成的二进制文件
- pkg:项目编译的中间产物,加速编译
- src:项目源码
- 弊端:无法实现package的多版本控制。
2.1.2 Go Vender - 项目目录下增加vender文件,每个项目引入一份依赖的副本,解决依赖冲突的问题。
- 弊端:无法控制依赖版本
2.1.3 Go Module - 通过go.mod文件管理依赖包版本
- 实现终极目标:定义版本规则和管理项目依赖关系。
2.2 依赖管理三要素 - 配置文件,描述依赖:go.mod
- 中心仓库管理依赖库:Proxy
- 本地工具:go get/mod
2.3.1 依赖配置-go.mod - 依赖管理基本单元
- 原生库
- 单元依赖:[Module Path][Version]
2.3.2 依赖配置-version - 语义化版本:MAJOR、MINOR、PATCH
- 基于commit伪版本:vX.0.0-yyyymmddhhmmss-abcdefgh1234(版本号、时间戳、哈希校验码)
- 关键字"//direct"非直接依赖;"+incompatible":对于没有go.mod且主版本2+的依赖 2.3.4 选择最低的兼容版本 2.3.5 依赖分发-Proxy
- 缓存源站中版本,稳定可靠
- 变量GOPROXY,URL站点列表+源站
2.3.6 工具-go get go get exampke.org/pkg - @update 默认
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支的最新commit go mod
- init 初始化,创建go.mod文件
- download 下载模块
- tidy 增加需要的依赖,删除不需要的依赖
- 测试
3.1 单元测试
3.1.1 规则
- 所有测试文件以_test.go结尾
- 测试函数格式:func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中:测试前数据装载、配置初始化,测试后释放资源及收尾工作
3.1.2 评估-代码覆盖率 - 通过对各个分支进行完备的测试
- 一般覆盖率:50-60%,较高覆盖率80%+
3.2 单元测试-Mock - 快速Mock函数:为一个函数打桩(A函数替换B函数,A为打桩函数)、为一个方法打桩
3.3 基准测试 - 优化代码,需要对当前代码分析
- 测试程序运行性能,对硬件资源损耗等
- 项目实践
4.1 需求描述
4.2 需求用例
- 根据需求描述抽取出实体
4.3 ER图(Entity Relationship Diagrom) - 实体及实体间关系
4.4 分层结构 - 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:识图View,处理和外部的逻辑交互
4.5 组件工具 - Gin 高性能go web 框架
- Go Mod
三、课后个人总结: 本节课程了解了Go语言依赖管理的演进路线,学习了测试的方法,感受了真实项目开发过程。对项目开发有很大的指导意义。