这是我参与「第五届青训营 」笔记创作活动的第2天
一、本堂课重点内容:
本节课了解go语言高性能的本质、go依赖管理和项目实战
二、详细知识点介绍:
1.并发编程
-
具有多核优势
-
采用多协程
-
开启协程:在调用函数的前面加上go关键字
-
补充:time.Sleep(time.Second)用于堵塞,用于保证子协程在协程完主协程不退出
-
-
提倡通过通信共享内存
-
并发安全lock
lock.Lock() 程序... lock.Unlock() -
WaitGroup 计数器作用:开启协程+1,执行结束-1,主协程阻塞直到计数器=0
- 三个方法:
- Add(delta int):+delta
- Done():-1
- Wait():阻塞直到计数器=0 小结:
- 三个方法:
-
Goroutine
-
Channel
-
Sync
2.依赖管理
演进:
GOPATH->Go Vendor->Go Module
2.1GOPATH
bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码
弊端:
无法实现package的多版本控制
2.2 Go Vendor
项目依赖会先找vendor,找不到再找gopath
弊端:
更新项目可能出现依赖冲突
2.3 Go Module
- go.mod:文件管理依赖包版本
- go get/go mod:指令工具管理依赖包
3.依赖管理三要素(类似maven)
- go.mod:配置文件,描述依赖
- Proxy:中心仓库管理依赖库
- go get/mod:本地工具
3.1 go.mod
- 原生库
- 单元依赖
3.2version
-
语义版本
${MAJOR}.${MINOR}.${PATCH}- major:可以不兼容(代码隔离)
- minor:兼容,新增函数,功能
- patch:代码bug修复
-
基于commit伪版本
vX.0.0-时间戳-12位哈希码的前缀
3.3indirect
A->B->C
A->B:直接依赖
A->C:间接依赖
3.4incompatible
对于没有go.mod文件并且主版本2+的依赖,会+incompatible(可能存在不兼容的代码逻辑)
3.5依赖图
选择最低的兼容版本
3.6依赖分发-回源
使用proxy稳定可靠
GOPROXY=“proxy1.cn,https://proxy2.cn,…”
go mod
| 指令 | 作用 |
|---|---|
| init | 创建go.mod文件 |
| download | 下载模块到本地缓存 |
| tidy | 增加需要的依赖,删除不需要的 |
4.测试
4.1回归测试
终端的测试
4.2集成测试
4.3单元测试(函数、模块等)
在一定程度上决定了代码的质量
- 规则
- 所以测试文件以_test.go结尾
- 格式:
func TestXxx(t *testing.T) - 初始化逻辑仿真TestMain中
- 代码覆盖率:执行的代码行与总代码行之比
- 依赖
- 幂等:重复测试结果一样
- 稳定:任何时间任何函数下都能独立运行
- Mock(monkey) 函数打桩:用一个函数替换原函数,不对本地文件有强依赖
4.4基准测试
格式:func BenchmarkXxxx(b *testing.B),基准测试函数没有返回值
提倡使用fastrand
b.ResetTimer()//定时器的重置,可以避免for循环之前的初始化代码的干扰
//并行
b.RunParallel(func(pb *testing.PB))