Go 语言进阶与依赖管理&工程实践及测试
语言进阶
1.1 Goroutine
- 协程:用户态,轻量级线程,栈kb
- 线程:内核态,线程跑多个协程,栈MB
- ex: 快速打印hello goroutine
1.2 CSP
通过通信共享内存,通过共享内存实现通信
1.3 Channel
make(chan 元素类型,[缓冲大小])
1.4 并发安全Lock
- lock sync.Mutex
- lock() unlock()
1.5 WaitGroup
- 计数器
- 开启协程+1;执行结束 -1;主携程阻塞直到计数器为0
依赖管理
站在巨人的肩膀上依赖库
2.1 Go依赖管理演进
GOPATH>Go Vendor>Go Module
2.1.1 GOPATH
- $GOPATH环境变量
(bin编译的二进制文件,pkg中间产物,src项目源码)
依赖src下的代码 - GOPATH-弊端
无法实现package多版本控制
2.1.2 Go Vendor
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
- Go Vendor-弊端
无法控制依赖版本
更新项目有可能出现依赖冲突,导致编译错误
2.1.3Go Module
定义版本规则和管理项目依赖关系
2.2 依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖 Proxy
- 本地工具 go get/mod
2.3.1依赖配置 - go.mod
...
module abc/def/gh//依赖管理基本单元
go 1.16 //原生库
require( //单元依赖
abc/xxxx
)
...
2.3.2 依赖配置-version
- 语义化版本
${MAJOR}.${MINOP}.${PATCH}
V1.3.0
V2.3.0 - 基于commit伪版本
vX.0.0-yyyymmddhhmmss-abcdefg12345
2.3.3 依赖配置-indirect
2.3.4 依赖配置-incompatible
2.3.5 依赖分发-回源
依赖分发-Proxy
2.3.6 依赖分发-变量 GOPROXY
2.3.7 工具- go get
2.3.8 工具- go mod
init //初始化
download //下载
tidy //增加需要的依赖
测试
- 回归测试/集成测试/单元测试
- 覆盖率变大,成本降低
3.1单元测试
3.1.1单元测试-规则
- _tets.go结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain - 保证质量,提升效率
3.1.2单元测试-例子
3.1.3单元测试-运算
3.1.4单元测试-assert
3.1.5 单元测试-覆盖率
代码覆盖率-测试用例的覆盖度
3.1.5 单元测试-Tips
- 一般覆盖率 50-60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
3.2 单元测试-依赖
外部依赖 =》 稳定&幂等
3.3 单元测试-文件处理
3.4 单元测试-Mock
- 为一个函数打桩
- 为一个方法打桩
3.5 基准测试
- 优化代码
- 内置的测试框架提供基准测试的能力
3.5.1 基准测试-例子
3.5.2 基准测试-运行
3.5.3 基准测试-优化
项目实践
4.1 需求描述
社区话题页面
4.2 需求用例
浏览消费用户
4.3 ER图
4.4 分层结构
数据层/逻辑层/视图层
4.5 组件工具
go web框架 go mod
4.6 Repository
Topic Post
Repository-index
数据行 -> 内存Map
Repository-查询
4.7 Service
4.8 Controller
4.9 Router
4.10 运行
总结:通过一个半小时的时间粗略地过了一遍go语言依赖管理和工程实践测试相关内容,具体的源代码还需要花时间去分析一下。