这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。
主要是学习了依赖管理和项目测试,理解了Go语言项目依赖管理的演进以及项目测试的方法。
一、本堂课重点内容:
- Go语言进阶与依赖管理
- 并发编程视角了解Go高性能本质
- Go依赖管理
- Go语言工程实践之测试
- 测试
- 项目实战
二、Go语言进阶与依赖管理:
1. 并发编程视角了解Go高性能本质
利用了多核
用户态:协程 栈MB
内核态:线程 栈KB
快速打印例子:开多个协程(goroutine)-- go func()协程函数
a. CSP(通信顺序进程)
通信共享内存--通道;而非共享内存实现通信--临界区
Channel 通信 -- 无缓冲(同步)、有缓冲 -- make
例子:
生产--子协程go func发送0-9数字
dest 缓冲 -- 考虑到消费者速度可能比生产者慢
消费--子协程go func计算输入数字平方
主协程main输出
b. Sync包
并发安全 Lock(对共享内存):
5个协程并发执行,多次后最终输出,未加锁结果错误。
WaitGroup -- 区别于sleep
计数器 Add Done Wait
2. Go依赖管理
单体函数--复杂项目--依赖库
GoPATH->GoVendor->GoModule(目前)
a. GoPATH
bin 编译二进制文件 -- pkg 编译中间产物、加速 -- src 项目源码(go get 最新版本存放位置)
弊端: 不同项目依赖同一package的不同版本 -- 无法实现Package多版本控制
b. GoVendor
增加vendor文件,存放依赖包副本
弊端: 一项目依赖多个项目(其依赖于同一package的不同版本)-- 无法控制依赖版本,出现依赖冲突
c. GoModule
目标:定义版本规则和管理项目依赖关系
go.mod 配置文件,描述依赖
go get/go mod 本地工具
Proxy 中心仓库管理依赖库
module 路径
go 1.16 原生库
require(
单元依赖[path][version]
)
version
${MAJOR大版本}.${MINOR新增函数等兼容}.${PATCH有bug修复}
V1.3.0
基于commit伪版本
vX.0.0-yyyymmddhhmmss时间戳-12位哈希码前缀
关键字
indirect间接依赖
incompatible主版本2以上需要增加/vN后缀,无go.mod文件时添加
选最低兼容版本37m处题目
依赖分发--回源
Proxy 保证依赖的稳定、可靠
GOPROXY="url列表,用逗号分割,direct表示源站"
Proxy1->Proxy2->dirext
go get example.org/pkg @ --
go mod -- init创建、download下载模块到本地缓冲、tidy增加需要依赖,删除不需要依赖
三、Go语言工程实践之测试:
1. 测试
事故 -- 通过测试来避免
回归(使用者)-集成(功能)-单元(函数)测试
输入、测试单元(函数、模块……)、输出与期望校对
a. 单元测试
规则:
文件_test.go结尾
func TestXxx(*testing.T)
TestMain:测试前数据装载、配置初始化;测试后,释放资源收尾
go test 运行
assert 校对包
评价:
代码覆盖率,一般50%-60%,较高80%+
测试分支相互独立、全面覆盖
测试单元粒度足够小,函数单一职责
b. Mock测试
单元
--file、DB、Cache
--稳定(函数隔离)、幂等(条件改变结果不变)
--Mock
monkey(mock测试包)
快速Mock函数:func Patch/Unpatch为函数/方法打桩测试、不依赖本地文件
c. 基准测试
用于性能分析、优化代码
2. 项目实战
项目拆解、代码设计、测试运行
a. 需求描述
社区话题页面
需求用例:用户--Topic话题、PostList帖子
ER(实体关系)图:结构体
b. 分层结构
file->
Repository数据层Model->
Service逻辑层Entity->
Controller视图层View->
Client
c. 代码设计
Gin高性能go web框架
Repository
Topic, Post
如何查询:
ID index -> map
Service
PageInfo
可用性:并行go func
Controller
构建View对象PageData
业务错误码
Router
初始化数据索引,引擎配置,路由,启动服务
运行
go run server.go
四、作业&课后个人总结:
针对课程中讲解的项目,完善以下功能:
-
支持发布帖子;
-
本地Id生成需要保证不重复、唯一性;
-
Append文件,更新索引,注意Map并发安全问题。
砚冰坚,手指不可屈伸,怠之。
五、引用参考:
标题:Go 语言进阶与依赖管理 - 掘金
标题:Go 语言工程实践之测试 - 掘金