go语言进阶——工程进阶 | 青训营笔记

87 阅读2分钟

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

语言进阶

并发: 多线程程序在一个核的cpu上运行 并行:多线程程序在多个核的cpu上运行

协程:用户态,轻量级线程,栈KB级别 启动goroutine

go func()

CSP: 通过通信共享内存而不是通过共享内存而实现通信

channel 创建: make(chan 元素类型, [缓冲大小]) 有无缓冲通道区别:goroutine是否同步

并发安全:lock 临界区

waitGroup 计数器,开启协程+1;执行结束-1;主协程阻塞知道计数器为零。

依赖管理

管理演进:GOPATH=>Go Vendor=> Go Module

GOPATH

go项目工作区,包含bin(编译的二进制文件)、pkg(项目编译的中间产物,加速编译),src(源码)三个文件夹 弊端:

  • 无法实现package的多版本控制

Go Vendor

增加vendor文件夹,存放项目依赖的副本 依赖寻址方式: vendor => GOPATH 弊端: 无法控制依赖的版本 更新项目又可能出现依赖冲突,导致编译出错

Go Module

通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包 定义版本规则和管理项目依赖的关系 依赖管理三要素:

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

go.mod

module 依赖管理基本单元

go [version] 原生库

[Module Path][Version/Pseudo-version] 单元依赖

version定义:

  • 语义化版本: ${MAJOR}.${MINOR}.${PATCH} -基于commit伪版本 vx.0.0.0-yyyymmddhhmmss-abcdefgh1234

不同major版本可能不兼容,minor更新功能,统一major下不同minor版本兼容,patch版本修bug

测试

类型:

  • 回归测试
  • 集成测试
  • 单元测试

单元测试

输入 -》 测试单元-》输出 vs 期望 规则:

  • 所有测试文件以_test.go结尾
  • 测试函数命名规范 func TestXxx(*testing.T)
  • 初始化逻辑放在TestMain中

一般覆盖率:50~60%,较高80%

外部依赖 =》 稳定&幂等 通过Mock保证

基准测试

规则:

  • 函数命名 BenchmarkXxx(b *testing.B)