Go工程进阶| 青训营笔记

92 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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

image.png image.png

2.依赖管理

2.1依赖管理三要素

  • 配置文件:描述依赖 go.mod
  • 中心仓库管理依赖库 Proxy
  • 本地工具:go get/mod 依赖配置-go.mod

image.png

2.2依赖配置-version

  • 语义化版本(v1.3.0 v2.3.0):

image.png

MAJOR是一个大版本,不同MAJOR之间可以是不兼容的;

MINOR在MAJOR做到前后兼容,在MINOR下做一些新增函数和功能;

PATCH是做一些代码BUG的修复。

  • 基于commit伪版本

image.png

vX.Y.Z:版本前缀和语义化版本一样

yyyymmddhhmmss:日期

abcdefg1234:12位哈希码前缀

2.3依赖配置-indirect

indirect表示非直接依赖(间接依赖) image.png

2.4依赖配置-依赖图

image.png 最终编译时所使用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. 回归测试
  2. 集成测试
  3. 单元测试

从1-3覆盖率逐层变大,成本逐渐降低

3.2单元测试

3.2.1单元测试-规则

  • 所有测试文件以_test.go结尾

image.png

  • func TestXxx(*testing.T)

image.png

  • 初始化逻辑放在TestMain中

image.png

3.2.2单元测试-覆盖率

命令:go test xxx_.test.go xxx.go --cover来显示代码覆盖率 image.png 通过不断提高代码覆盖率,保证了测试的完备性

3.2.3单元测试-Tips

  • 一般覆盖率50%-60%,较高覆盖率80%+
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责

3.3单元测试-Mock

Mock函数:

为一个函数打桩

为一个方法打桩

如果有些外部依赖,可以选择Mock测试,对函数进行打桩测试,使其不在依赖本地文件,保证稳定安全

3.4基准测试

基准测试写法如下(以Benchmark开头,单元测试以Test开头) image.png

4.参考资料

字节内部课:后端入门-Go语言原理与实践

看到这篇文章的掘友们,如文章有问题欢迎指正并在评论区进行讨论,望共同努力进步,感谢你们的支持点赞!