这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
序言
本文记录和整理了本人在字节青训营中学习的一些所得所想,用于本人回顾和梳理相关知识点,也欢迎大家参考,一同学习。如果发现有问题或者错误,可以在下方留言或者私信我(^-^)
本文回顾了 go 并发编程、go 依赖管理和 go 项目测试等工程进阶内容
go语言进阶
并发编程
『不要通过共享内存来通信,我们应该使用通信来共享内存』go 并发编程中遵循了这一设计哲学。关于为什么要通过通信来实现共享内存,可以看看这篇文章为什么使用通信来共享内存。
知识点如下:
- 协程 Goroutine
- 通道 Channel
- 锁 Lock pkg.go.dev/sync
- 线程同步 WaitGroup pkg.go.dev/sync
依赖管理
go 的依赖管理经历了三个阶段,分别是 Gopath、Go Vendor、Go Module。
Gopath
- 项目全部 download 到 Gopath 对应路径下面,项目代码直接依赖 src 下的代码。go get 下载最新版本到src目录下面。多项目切换时需要更改 Gopath,无法实现 package 的并发控制。
Go Vendor
- 项目目录下面增加了vendor文件,依赖寻址方式 ,先寻找 vendor,再寻找 Gopath。
- 给每一个项目引入一份依赖的副本,解决了多个项目需要同一个 package 依赖的冲突问题
- 无法控制依赖版本,项目依赖之间可能出现版本冲突。
Go Module
- go.dev/blog/using-…
- 通过
go mod
文件管理依赖包版本 - 通过
go get
和go mod
相关指令来管理依赖包 - 国内需要使用 proxy
依赖管理三要素
- 配置文件,描述依赖:go.mod
- 中心仓库管理依赖库:proxy
- 本地工具:go get/go mod
go.mod
Go module 遵循语义化版本规范 2.0.0。语义化版本规范 2.0.0 规定了版本号的格式,每个字段的意义以及版本号比较的规则等等。如V1.3.0
,版本格式:主版本号.次版本号.修订号
,版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号: 当你做了向下兼容的问题修正。
go.mod 中除了上述的语义化版本,还有一些提供特殊信息的关键字,如indirect
表明间接依赖;
incompatible
用于标识一些未使用 go.mod 的第三方库,这些库中可能会存在不兼容的代码逻辑。对于没有go.mod 文件且主版本 2+ 的依赖,会在版本号后面加上该关键词,
面临可能的依赖冲突时,go 依赖一般会选择满足本次构建的最低兼容版本。
proxy
安装go后,一定要配置 go proxy,proxy类似于 Java 的 maven 镜像源,提供上游源的镜像文件。可以参考 goproxy.cn/ 里面的描述配置,可以大大加快下载第三方依赖包的速度。
go get
go get 拉取当前项目的依赖库。常见用法如下:
go get example.com.org/pkg + 后缀
- @update 默认拉取最新版本
- @none 删除依赖
- @v1.1.2 tag版本
- @23fdd5 特定的commit
- @master 分支的最新commit
go mod
常见用法如下:
go mod init 项目初始化,创建 go.mod 文件
go mod download 下载模块到本地缓存
go mod tidy 增加需要的依赖,删除不需要的依赖
项目测试
项目测试包含单元测试、集成测试和回归测试。
单元测试
单元测试中最主要的评估标准就是代码覆盖率。一般业务的代码覆盖率应该在 50%~60% ,此时可以基本覆盖函数的主流程。较高的代码覆盖率为 80%。大型的开源项目会在 pr 时进行代码覆盖率测试,对单元测试和代码覆盖率都有相应要求。单元测试还应保证测试分支相互独立,全面覆盖。测试单元粒度足够小,函数单一职责。具体可以参考软件测试的覆盖级别。
测试环境要保证单元测试环境的外部依赖(file、DB、cache)稳定且幂等,不论何时何地执行单元测试,执行结果均应相同。
单元测试概念和规则:go.dev/doc/tutoria…
mock测试
mock 测试可以保证测试环境的稳定性和幂等性,通过打桩来替换函数或者方法。
Mock 测试:github.com/bouk/monkey
基准测试
函数 Benchmark 开头,支持串行化和并行化测试。通过基准测试可以判断性能,便于进行性能对比。比如 fastrand 和 rand。
总结
本文回顾了 go 并发编程、go 依赖管理和 go 项目测试等工程进阶内容