这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1.主要内容
Go的进阶
Go的依赖管理
测试
2.本节详细内容
Go进阶知识点
- Go提倡通过共享内存而不是通过共享内存实现通信
- Go具有独特的轻量级协程Goroutine
- Go 的并发原则非常优秀,目标就是简单:尽量使用 channel;把 goroutine 当作免费的资源,随便用。
- Channel具有无缓冲和有缓冲两种,无缓冲为即时
- 如果使用go的goroutine一定加锁,不加会有安全和逻辑问题
- 使用WaitGroup进行协程的同步阻塞
依赖管理
- 实际工程较为复杂,需要将涉及的框架、日志系统、驱动等通过SDK引入,需要对依赖包进行管理
- Go的依赖管理发展为:GOPATH-Go Vendor-Go Module,目前主要使用Go Module
GOPATH
- 项目直接依赖src下的代码
- 多项目直接依赖同一个库中的同一份代码,不能依赖同一个库的不同版本,无法实现package的多版本控制
Go Vendor
- 为了解决GOPATH的问题提出,通过每个项目引入一份依赖的副本解决
- 当前项目存在vendor目录,会优先使用该目录的依赖,不存在则在GOPATH中寻找
- 无法解决依赖包的版本变动与同一项目中依赖一个package中不同版本的问题,例如A依赖B和C,但B和C依赖了D不同版本
- 更新项目有可能出现依赖的冲突,编译出错
Go Module
- Go 1.16默认开启,一般称go mod
- 通过go.mod文件管理依赖包版本,通过go get/go mod管理
- indirect后缀表示间接依赖
- incompatible后缀用在对于一些比较老的项目,可能当时go mod还没出现,但版本迭代到v2 以上,或者有些项目没有遵循更新版本原则,go mod为了能够正常使用它们,会使用这个后缀
- go mod在处理A依赖B和C,但B和C依赖了D的1.3和1.4版本,最终编译时版本为1.4,使用最低兼容的版本
- Go proxy是服务站点,缓存站中软件内容,缓存的软件版本不会改变,源站删除后也可用,使用Go proxy后,构建时会直接从Go proxy站点拉取
- go mod提交前执行go tidy
测试
- 单元测试的覆盖率一定程度决定代码质量
- 回归测试人工手动固定主流场景,测试覆盖率较低
单元测试
- 单元测试主要包括输入、测试单元、输出、校对
- 所有测试文件以_test.go结尾
- 初始化逻辑放到TestMain中
- 单元测试评价为代码覆盖率,一般要求50-60%覆盖率,资金型80%,测试分支相互独立,测试单元粒度要够小。
基准测试
使用方法类似单元测试,用来测试程序的运行性能和占用,以Benchmark开头
3.项目实践
- 需求为掘金社区话题,展示话题和回帖,实现本地web服务,话题和回帖数据使用文件存储
- 整体分三层,数据层,逻辑层。数据层关联底层数据模型,面向逻辑层,对service层透明;Service逻辑层处理核心业务逻辑;Controller层负责处理交互
- web框架使用gin,字节有自己的框架hertz
4.课后总结
- 实践项目虽然篇幅较少但是需要再学习,gin框架较为常用
- Go语言进阶中讲的goroutine、channel和锁是重点内容,需要对照课后的学习路线进行进一步的了解
- 课程中的课程资料需要看看
5.引用
字节内部课:Go 语言入门 - 工程实践
go.dev/blog/using-…