这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
一、本堂课重点内容:
- 本堂课的知识要点有哪些?
1.语言进阶2.依赖管理3.测试4.项目实战
二、详细知识点介绍:
- 本堂课介绍了哪些知识点?
- 语言进阶
1.go语言充分发挥多核优势,调度协程(goroutine)。协程是用户态级别的轻量级线程,栈MB级别 2.CSP(communicating Sequential Processes)。go语言提倡通过通信共享内存而不是通过共享内存而实现通信 3.channel。go语言通过make(chan 元素类型 ,[缓冲大小])来开辟通道,通过有无缓冲大小分为有缓冲通道和无缓冲通道。 4.并发安全Lock。Lock加锁,Unlock解锁 5.WaitGroup并发任务同步,add开启协程+1,Done执行结束-1,wait主协程阻塞直到计数器为0。
- 依赖管理
类似java中API
依赖管理演进:GOPATH->Go Vendor -> Go Module
GOPATH:src︰存放Go项目的源码。pkg∶存放编译的中间产物,加快编译速度。bin∶存放Go项目编译生成的二进制文件。 缺点:无法实现package的多版本控制
Go Vendor:通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。但vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题,更新项目又可能出现依赖冲突,导致编译出错。
Go Module:1.go.mod(配置文件,描述依赖)2.Proxy(中心仓库管理依赖库)3.go get/mod(本地工具)
indirect间接依赖,对于没有go.mod文件并且主版本在2或者以上的依赖,会在版本号后加上+incompatible后缀
从哪里下载go module? github,对于go.mod,直接可以从对应仓库中下载软件依赖,完成依赖分发。但存在多个问题,1.无法保证构建确定性︰作者增加/修改/删除软件版本,导致找不到依赖版本。2.无法保证依赖可用性︰作者删除软件,导致依赖不可用;3.第三方代码托管平台压力增加。
解决方法:Proxy(稳定,可靠)。类似缓存,GO PROXY会依次向下寻找,如果不存在则会回源到源站直接下载依赖,缓存到proxy站点中。
go get:后缀@update默认 @none删除依赖 @v1.1.2tag版本,语义版本 @23dfdd5特定的commit @master分支的最新commit
go mod:inita初始化,创建go.mod文件 download下载模块到本地缓存 tidy增加需要的依赖,删除不需要的依赖
- 测试
1.回归测试2.集成测试3.单元测试
层级从上至下,测试成本逐渐减低,而测试覆盖率逐步上升
单元测试:校对代码的功能与我们的预期相符。测试文件以_text.go结尾。
覆盖率:所写代码行数与实际运行行数的比例。
单元测试需要保证稳定性和幂等性,要用到mock机制。
稳定:能在任何时间,任何环境,运行测试。 幂等:每一次测试运行都应该产生与之前一样的结果。
Mockey Patch的作用域在Runtime,在运行时通过Go的 unsafe包,将内存中函数的地址替换为运行时函数的地址。将待打桩函数或方法的实现跳转。脱离了本地文件的束缚和依赖。
集成测试:优化代码,需要对当前代码分析,内置的测试框架提供了基准测试的能力
三、实践练习例子:
- 有什么实践举例帮助理解知识点?
社区话题页面
四、课后个人总结:
- 本章有什么知识点不容易掌握?
测试代码,测试的多样化,测试的方式多,复杂