1 语言进阶
1.1 Goroutine
线程:内核态,栈MB级别
协程:用户态,轻量级线程,栈KB级
1.2 CSP
提倡通信实现共享内存
1.3 Channel
创建方法
make(chan 元素类型,缓冲区大小)
无缓冲通道:make(chan int);有缓冲通道:make(chan int,2)
示例:
1.4 并发安全
1.5 WaitGroup
原理为计数器,统计协程数
Add(int)表示启动了几个协程,每个协程结束调用Done(),主协程Wait()等待所有协程结束再推出。
示例:
2 依赖管理
2.1 Go依赖管理演进
GOPATH -> Go Vendor -> Go Module
如今主流是go mod
2.1.1 GOPATH
目录结构:
项目代码直接依赖src文件夹的代码,go get下载最新版本的包到src目录下。
缺点为无法实现package的多版本控制
2.1.2 Go Vendor
项目目录下增加了vendor文件,存放依赖包副本。依赖寻址先从vendor开始寻找,然后再找GOPATH
缺点是无法控制依赖的版本
2.1.3 Go Module
通过go.mod文件管理依赖包版本,通过go get和go mod管理依赖包
2.2 依赖管理三要素
- 配置文件,描述依赖(go.mod)
- 中心仓库管理依赖库(Proxy)
- 本地工具(go get/mod)
2.3 依赖配置
2.3.1 go.mod
2.3.2 version
语义化版本:${MAJOR}.${MINOR}.${PATCH}
基于commit伪版本
2.3.3 indirect
表示间接依赖,如A直接依赖B,B直接依赖C,那么A间接依赖C。
2.3.4 incompatible
表示可能不兼容
2.3.5 依赖图
选择最低兼容版本
2.3.6 依赖分发-回源
从代码托管平台依赖,造成一系列问题
2.3.7 依赖分发-Proxy
2.3.6 依赖分发-变量GOPROXY
从第一个网址开始寻找,直到源站
2.3.7 工具-go get
2.3.8 工具-go mod
2.3.9
3 测试
3.1 单元测试
3.1.1 规则
3.1.2 例子
3.1.3 运行
3.1.4 assert
3.1.5 覆盖率
由于三行代码只执行了两行代码,所以覆盖率为66.7%
一般覆盖率在50%~60%,金融相关需要在80%以上。
3.2 Mock测试
导入monkey包
主要思想是打桩,不改变原变量
示例:
3.3 基准测试
4 项目实战
根据帖子id查询到帖子内容及相关评论