这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记.
01语言进阶
并发VS并行
- 多线程程序在一个核的cpu运行
- 多线程程序在多个核的cpu运行 Go可以充分发挥多核优势,高效运行--为并发而生。
1.1 Goroutine
- 协程:用户态,轻量级,栈KB级别
- 线程:内核态,线程跑多个协程,栈MB级别
1.2 CSP
提倡通过通信共享内存而不是通过共享内存而实现通信!
1.3 Channel
make(chan元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int, 2)
1.4 并发安全lock
右边都开启五个协程进行并发执行进行测试
1.5 WaitGroup
计数器:Add开启协程+1,Done执行结束-1,Wait主协程阻塞直到计数器为零
02依赖管理
2.1 Go依赖管理演进
- GOPATH
- Go Vendor
- Go Moudle
- 不同的项目的环境依赖不同
- 控制依赖库的版本
GOPATH
- 项目代码直接依赖src下的代码
- Go get 下载最新版本的包到src目录下 弊端:无法实现package的多版本控制
Go Vendor
- 项目目录添加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式 vendor->GOPATH
- 通过每个项目引入一份依赖副本,解决了package的冲突问题 弊端:无法控制依赖版本、更新项目可能导致依赖冲突编译错误
Go Moudle
- 通过go.mod文件管理依赖包版本
- 通过go get/ go mod 指令工具管理依赖包 终极目标:定义版本规则和管理项目依赖关系
2.2 依赖管理三要素
配置文件 描述以来 go.mod
中心仓库管理依赖库 Proxy
本地工具 go get/mod
03测试
回归测试、集成测试、单元测试
3.1 单元测试
单元测试决定代码质量
单元测试规则:
- 所有测试与_test.go结尾
- func TestXxx(*Testing.T)
- 初始化逻辑放到TestMain中
3.2 依赖
快速 Mock
- 为一个函数打桩
- 为一个方法打桩
基准测试
- 优化代码,需要对代码进行分析
- 内置的测试框架提供了基准测试的能力