5月8日Go语言上手-工程实践笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
1.go语言一大特点:快速
2.并发和并行:
- 并发:多线程程序在同一个核的CPU上运行
- 并行:多线程程序在多个核的CPU上运行
- Go可以充分发挥多核优势,高效运行
3.协程和线程:
- 协程:用户态,轻量级线程,栈KB级别
- 线程:内核态,线程跑多个协程,栈MB级别
4.go提倡通过通信(eg:通道)共享内存而不是通过共享内存而实现通信
5.管道Channel:
- 初始化:make(chan type, [Size])
- 无缓冲管道:make(chan int)
- 特点:收发方同步,又称同步通道
- 有缓冲管道:make(chan int, num) (num表示缓冲通道的容量大小)
6.Lock实现并发安全控制:
- 初始化:lock sync.Mutex
lock sync.Mutex
for i := 0; i < 2000; i ++ {
lock.Lock()
x += 1
lock.Unlock()
}
7.WaitGroup:
- 功能:内部维护了一个计时器,开启线程+1,执行结束-1;主线程阻塞直到计时器为0。
var cnt sync.WaitGroup
cnt.Add( delta: 5) // 设置初值为5,表示5个协程
for i := 0; i < 5; i ++ {
go func(j int) {
defer cnt.Done() // 一个协程执行结束-1
hello(j)
}
}
cnt.Wait() // 主线程阻塞直到计数器为0
8.Go依赖管理演进: GOPATH -> Go Vendor -> Go Module
- 不同环境(项目)依赖的版本不同
- 控制依赖库的版本
9.GOPATH:
- GOPATH环境变量:bin(项目编译的二进制文件)、pkg(项目编译的中间产物,加速编译)、src(项目源码)
- 项目代码直接依赖src下的代码
- go get下载最新版本的包到src目录下
- 弊端:无法实现package的多版本控制
10.Go Vendor:
- 项目目录下增加vendor文件,所有依赖包副本形式放在vendor文件夹
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
- 弊端:
- 无法控制依赖的版本
- 更新项目又可能出现依赖错误,导致编译出错
11.Go Module:
- 通过go.mod文件管理依赖包版本
- 通过go get/go mod指令工具管理依赖包
12.依赖管理三要素:
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
13.单元配置:
module example/project/app // 依赖管理基本单元
go 1.16 // 原生库
require( // 单元依赖
...
)
14.依赖配置——version:
- 语义化版本
${MAJOR}.${MINOR}.${PATCH}eg:V1.3.0 - 基于commit伪版本
vx.0.0-yyyymmddhhmmss(时间戳)-abcdefgh1234(hash校验码)
15.依赖选择:
- 选择最低的兼容版本
此时会选择C v1.4
16.依赖分发-回源:
- 依赖分发:依赖去哪下载(代码管理仓库)
- 缺点:
- 无法保证构建稳定性(增加/修改/删除软件版本)
- 无法保证依赖可用性(删除软件)
- 增加第三方压力(代码托管平台负载问题)
17.依赖分发-Proxy:
- Proxy:实际是一个服务站,缓存源站中的软件内容,缓存的软件版本也不改变
18.工具-go get:
- go get example.org/pkg 默认拉取的是major版本的最新提交
- 在
go get example.org/pkg后加:- @update (等于什么都不加) 表示默认
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支的最新commit
19.工具-go mod:
- go mod init 初始化,创建go.mod文件
- go mod download 下载模块到本地缓存
- go mod tidy 增加需要的依赖,删除不需要的依赖
20.测试:
- 回归测试:手动通过终端回归一些固定的场景检查
- 集成测试:通过服务暴露的某些接口进行自动化测试
- 单元测试:开发者对单独的函数模块进行验证
- 从上到下,覆盖率逐层增大,成本逐层降低
21.单元测试:
- 规则:
- 所有测试文件以 _test.go 结尾
- func TestXxx(name *Testing.T)
- 初始化逻辑放到TestMain中
22.单元测试—Mock:
快速Mock函数:使测试不再依赖本地文件
为一个函数打桩
为一个方法打桩