这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
本节课主要内容梳理
语言进阶
并发VS并行
- 并发可以同时处理好多事情。
- 并行是同时做好多事情。
Go可以充分发挥多核优势,高效运行
Goroutine
- 线程:用户态,轻量级线程,栈MB级别。
- 协程:内核态,线程跑多个协程,栈KB级别。
用go开启协程
time.Sleep()休眠,来阻塞
输出结果,乱序输出,并行
CSP(Communicating Sequential Processes)
- 通过通信共享内存
- 通过共享内存实现通信
提倡通过通信共亨内存而不是通过共字内存而实现通信
Channel
make(chan元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
并发安全Lock
通过lock()和Unlock()实现
WaitGroup
- Add(delta int) 计数器+delta
- Done() 计数器-1
- Wait()阻塞直到计数器为0
实例代码
依赖管理
背景
- 工程项目不可能基于标准库0~1编码搭建
- 管理依赖库
Go依赖管理演进
- 不同环境(项目)依赖的版本不同
- 控制依赖车的版本
GOPATH
- 项目代码直接依赖src下的代码
- go get下载最新版本的包到src目录下
GOPATH弊端:无法实现package的多版本控制
Go Vendor
通过每个项目引入一份依赖的副本, 解决了多个项目需要同一个 package依赖的冲突问题。
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式: vendor =>GOPATH
Go Vender弊端:无法控制依赖的版本。 更新项目又可能出现依赖冲突,导致编译出错。
Go Module
- 通过
go.mod文件管理依赖包版本 - 通过
go get/go mod指令工具管理依赖包
依赖管理三要素(类似于maven)
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
依赖配置 go.mod
依赖标识:[Module Path] [Versin/Pseudo-version]
依赖配置-version
gaopath和govendor都是源码副本方式依赖,没有版本规则概念,而gomod为了放方便管理则定义了版本规则,分为语义化版本和基于commit伪版本
依赖配置-indirect
依赖配置-incompatible
- 主版本2+模块会在模块路径增加/vN后缀。
- 对于没有 go.mod文件并且主版本2+的依赖,会+incompatible
依赖分发-Proxy
figo proxy就是解决这些问题的方案,Go Proxy是一个服务站点,它会缓源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用
依赖分发-变量GOPROXY
GOPROXY="proxy1.cn, proxy2.cn ,direct"
服务站点URL列表,direct表示源站
go get
go mod
测试
- 回归测试
- 集成测试
- 单元测试
从上到下,覆盖率逐层变大,成本却逐层降低
单元测试
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
单元测试-Mock
摆脱了本地文件的束缚和依赖
基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
项目实战就不记录了,因为还不太明白=v=
遇事不决,可问春风!