GoModule初接触与工程初解 | 青训营笔记

69 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。

Go语言进阶

Goroutine

协程:用户态,轻量级线程,栈MB级别。
线程:内核态,线程跑多个协程,栈KB级别。

Channel

Go语言提倡通过通信来实现共享内存。
make(chann [变量类型],[空间大小])
无缓冲通道,又称同步通道,不定义空间大小就是无缓冲的。
有缓冲通道,可以解决生产者和消费者执行能力不同带来的时间损失,提高效率。

Sync

提供Mutex包,包含Lock()函数锁住共享内存,防止并发下共享内存被错误操作或者遗漏操作。
提供WaitGroup包,包含Add(delta int),Done(),Wait()实现阻塞等待并发协程全结束。

依赖管理

发展:GOPATH->GOVENDOR->GOMODULE
GOPATH无法管理依赖的版本,项目间的协同十分混乱。
GOVENDOR仍然无法控制依赖的版本,更新项目容易导致依赖冲突。
GOMODULE能够定义版本规则和管理项目依赖关系。

测试

回归测试,集成测试,单元测试,从前到后覆盖率变大,但是成本逐渐降低,单元测试的结果一定程度上决定着代码质量。

单元测试

单元测试规则

所有测试文件以_test.go结尾,func TestXxx(*testing.T),初始化逻辑放到TestMain中。
go test xxx_test.go xxx.go

评估单元测试-覆盖率

go test xxx_test.go xxx.go --cover
一般项目50%~60%的覆盖率,高要求项目80%~。
测试分支尽量相互独立,全面覆盖,测试单元粒度要求足够小,函数职责尽量单一,这样覆盖率就能尽量高。

Mock

github.com/bouk/monkey 提供了Mock用的工具。

幂等

多次运行测试,结果相同。

稳定

测试相互隔离,任何时间任何函数测试能独立运行。

Monkey

Patch(target,replacement interface{})替换函数。
Unpatch(target)还原。

基准测试

优化代码,对当前代码进行分析。

工程实践

分层结构

数据层 Model 外部数据的增删查改。
逻辑层 Enetity 处理核心业务逻辑输出。
视图层 Controller 处理和外部的交互逻辑。
不恰当的概括一下,数据层就是对数据库等进行操作,逻辑层就是用数据层的结果进行处理,视图层则是最终将逻辑层取得的结果输出到外部得到最终成品。