1 语言进阶
并发编程了解go高性能
1.1 并发和并行
1.2 Goroutine
- 协程:用户态,轻量级线程,栈MB级别 ?
- 线程:内核态,线程跑多个协程,栈KB级别 ?
1.3 CSP(Communicating Sequential Processes)
提倡通过通信共享内存
1.4 Channel
make(chan 元素类型, [缓冲大小])
- 无缓冲通道
make(chan int),发送和接受的Goroutine同步化。 - 有缓冲通道
make(chan int, 2)
1.5 并发安全Lock
主要解决竞态
1.6 WaitGroup
实现并发任务的同步
- Add(delta int) : 计数器+ delta
- Done() :计数器-1
- Wait() : 阻塞直到计数器为0
2 依赖管理
go语言依赖管理的演进路线GOPATH -> Go Vendor -> Go Module,现如今主要使用GoMOD
2.1 GOPATH
项目代码直接依赖src下的代码,go get 下载最新版本的包到src目录下
- 弊端
- 场景:A和B依赖于某一package的不同版本
- 问题:无法实现package的多版本控制
2.2 Go Vendor
项目目录增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
依赖寻址方式:vendor => GOPATH
- 弊端
- 无法控制依赖版本
- 更新项目可能出现依赖冲突,导致编译出错
2.3 Go Module
- 通过
go.mod文件管理依赖包版本 - 通过
go get/go mod指令工具管理依赖包
2.3.1 管理三要素
-
- 配置文件,描述依赖 go.mod
-
- 中心仓库管理依赖库 Proxy
-
- 本地工具 go get/mod
2.3.2 依赖配置
2.3.2.1 go.mod
2.3.2.2 version
- 语义化版本
${MAJOR}.${MINOR}.${PATCH}, 如V3.3.0 - 基于commit 伪版本
Vx.0.0-yyyymmddhhmmss-abcdefgh1234
2.3.2.3 indirect
A->B->C
- A->B 直接依赖
- A->C 间接依赖
2.3.2.4 incompatible
- 主版本2+模块会在模块路径增加/vN后缀
- 对于没有
go.mod文件并且主版本2+的依赖,会+incompatible
2.3.3 依赖分发-Proxy
GOPROXY="https://proxy1.cn, https://proxy2.cn ,direct"
- "direct"表示源站
- Proxy1 -> Proxy2 -> Direct
2.3.4 go get
2.3.5 工具 go mod
3 测试
单元测试,Mock测试,基本测试相关
3.1 单元测试
3.1.1 规则
- 所有测试文件以
_test.go结尾 func TestXxx(*testing.T)- 初始化逻辑放到
TestMain中
3.1.2 assert
3.1.3 覆盖率
- 一般覆盖率 :50 ~ 60%,较高覆盖率80%
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
3.1.4 依赖
外部依赖 => 稳定(相互隔离)&幂等(重复运行结果一致)
3.2 mock
monkey : github.com/bouk/moneke… 快速mock函数
- 为一个函数打桩
- 为一个方法打桩
对ReadFirstLine打桩测试,不再依赖本地文件
3.3 基准测试
- 优化代码,对当前代码分析
- 内置的测试框架提供了基准测试的能力
3.3.1 基准测试 -例子
随机执行服务器
基准测试例子:
4 项目实战
需求设计,代码开发,测试运行
4.1 需求描述
4.2 需求用例
4.3 ER图
4.4 分层结构
- 数据层:数据Model,外部数据的怎删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:属兔view,处理和外部的交互逻辑