这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
语言进阶
并发: 多线程程序在一个核的cpu上运行 并行:多线程程序在多个核的cpu上运行
协程:用户态,轻量级线程,栈KB级别 启动goroutine
go func()
CSP: 通过通信共享内存而不是通过共享内存而实现通信
channel 创建: make(chan 元素类型, [缓冲大小]) 有无缓冲通道区别:goroutine是否同步
并发安全:lock 临界区
waitGroup 计数器,开启协程+1;执行结束-1;主协程阻塞知道计数器为零。
依赖管理
管理演进:GOPATH=>Go Vendor=> Go Module
GOPATH
go项目工作区,包含bin(编译的二进制文件)、pkg(项目编译的中间产物,加速编译),src(源码)三个文件夹 弊端:
- 无法实现package的多版本控制
Go Vendor
增加vendor文件夹,存放项目依赖的副本 依赖寻址方式: vendor => GOPATH 弊端: 无法控制依赖的版本 更新项目又可能出现依赖冲突,导致编译出错
Go Module
通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包 定义版本规则和管理项目依赖的关系 依赖管理三要素:
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
go.mod
module 依赖管理基本单元
go [version] 原生库
[Module Path][Version/Pseudo-version] 单元依赖
version定义:
- 语义化版本: ${MAJOR}.${MINOR}.${PATCH} -基于commit伪版本 vx.0.0.0-yyyymmddhhmmss-abcdefgh1234
不同major版本可能不兼容,minor更新功能,统一major下不同minor版本兼容,patch版本修bug
测试
类型:
- 回归测试
- 集成测试
- 单元测试
单元测试
输入 -》 测试单元-》输出 vs 期望 规则:
- 所有测试文件以_test.go结尾
- 测试函数命名规范 func TestXxx(*testing.T)
- 初始化逻辑放在TestMain中
一般覆盖率:50~60%,较高80%
外部依赖 =》 稳定&幂等 通过Mock保证
基准测试
规则:
- 函数命名 BenchmarkXxx(b *testing.B)