这是我参与「第五届青训营 」伴学笔记创作活动的第4天
1.语言进阶
1.1Goroutine(协程)
- 协程:用户态,轻量级线程,栈KB级别
- 线程:内核态,线程可运行对个协程,栈MB级别
1.2csp
Go提倡通过通信而共享内存,而不是通过共享内存而通信
1.3chanel
- chanel是一种引用类型
- 创建:make(chan 元素类型,[缓冲大小])
- 根据是否有缓冲区分为无缓冲通道(也被称为同步通道)和有缓冲通道
1.4WaitGruop
- Go使用WaitGruop进行并发任务的同步
- WaitGruop有三个方法Add(delta int),Done(),Wait()
- WaitGruop中维护一个计数器,使用Add将计数器+delta,使用Done将计数器-1,使用Wait阻塞计数器直至计数器为0
2.依赖管理
2.1依赖管理三要素
- 配置文件:描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具:go get/mod 依赖配置-go.mod
2.2依赖配置-version
- 语义化版本(v1.3.0 v2.3.0):
MAJOR是一个大版本,不同MAJOR之间可以是不兼容的;
MINOR在MAJOR做到前后兼容,在MINOR下做一些新增函数和功能;
PATCH是做一些代码BUG的修复。
- 基于commit伪版本
vX.Y.Z:版本前缀和语义化版本一样
yyyymmddhhmmss:日期
abcdefg1234:12位哈希码前缀
2.3依赖配置-indirect
indirect表示非直接依赖(间接依赖)
2.4依赖配置-依赖图
最终编译时所使用C项目的版本是V1.4(选择最低兼容版本)
2.5依赖分发-GOPROXY
配置:GOPROXY="proxy1.cn,https://proxy2中.cn…"
依赖查找路径:先从proxy1中查找,proxy1中没有,再从proxy2中查找,proxy2中没有最后再从direct中查找(direct表示源站)
2.6工具-go get
go get example.org/pkg
- @update:默认
- @none:删除依赖
- @v1.1.2:tg版本语义化版本
- @ancd123:特定的commit版本
- @master:分支最新的commit
2.7工具-go mod
go mod init:初始化,创建go.mod文件 download:下载模块到本地缓存 tidy:增加需要的依赖,删除不需要的依赖
3.测试
测试是避免事故的最后一道屏障
3.1测试类型
- 回归测试
- 集成测试
- 单元测试
从1-3覆盖率逐层变大,成本逐渐降低
3.2单元测试
3.2.1单元测试-规则
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放在TestMain中
3.2.2单元测试-覆盖率
命令:go test xxx_.test.go xxx.go --cover来显示代码覆盖率
通过不断提高代码覆盖率,保证了测试的完备性
3.2.3单元测试-Tips
- 一般覆盖率50%-60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
3.3单元测试-Mock
Mock函数:
为一个函数打桩
为一个方法打桩
如果有些外部依赖,可以选择Mock测试,对函数进行打桩测试,使其不在依赖本地文件,保证稳定安全
3.4基准测试
基准测试写法如下(以Benchmark开头,单元测试以Test开头)
4.参考资料
字节内部课:后端入门-Go语言原理与实践
看到这篇文章的掘友们,如文章有问题欢迎指正并在评论区进行讨论,望共同努力进步,感谢你们的支持点赞!