这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
go语言进阶与依赖管理
go并发
-
协程是用户态的,轻量级别,栈KB级别;线程是内核态的,比较重,MB级别。
-
协程之间尽量使用CSP的形式进行通信,即通过chan;如果使用共享内存,需要注意并发安全的问题,一般采用sync.Mutex来上锁。
-
协程任务中,需要阻塞来进行并发任务管理;
可以通过sync.WaitGroup来阻塞管理。waitGroup本质维护一个协程计数器,开启协程,计数器Add加协程数,退出一个协程,计数器Done减1,Wait()为0,退出。
go依赖管理
历史方案
-
GOPATH
全局src管理库,导致版本会有冲突。
-
GO Venfor
项目vendor目录保存该项目的依赖副本,项目优先从vendor寻找依赖包。 缺点是:如果本项目的依赖库之间如果有冲突,编译会有问题。
-
Go Module
通过go.mod管理依赖包版本,通过go get/go mod管理依赖包
中心管理仓库Proxy依赖分发:GOPROXY = "url1,urls2,direct"
go get url@版本分支
go mod init/download/tidy
Go工程实践-测试
回归测试、集成测试、单元测试
单元测试-规则:
- 测试文件以
_test.go结尾 - 测试函数以
TestNnn(t *testing.T)方式 - 初始化逻辑通过
TestMain(m *testing.M)断言包:"github.com/stretchr/testify/assert";使用类似python的assert.Equal()func TestMain(m *testing.M) { // pre action code := m.Run() // after action os.Exit(code) } // go test file_test.go
代码覆盖率
go test file_test.go --cover
- 覆盖率是指测试代码所测试的代码的覆盖率
- 提升覆盖率,对不同分支都均进行测试
单元测试-依赖
有一些函数依赖外部的文件或者数据库以及网络之类,造成测试时,不能保证结果的稳定和幂等。此时可以使用mock对函数进行打桩;这样可以把对代码的测试和外部依赖剥离开,解决依赖不稳定的问题。
mock:github.com/bouk/monkey
基准测试
func BenchmarkNnn(b *testing.B){
b.ResetTimer()
}