这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记。
1 语言进阶 并发编程
并发:多线程在一个核,抢占时间片
并行:多线程在多核运行
1.1 Goroutine
线程:内核态
协程:用户态,轻量级线程,由go语言实现
通过go这一关键词来开启协程
1.2 CSP
提倡通过通信共享内存而通过共享内存实现通信
1.3 Channel
初始化 make(chan 元素类型, [缓冲大小])
无缓冲通道 make(chan int)
有缓冲通道 make(chan int, 2)
用缓冲可以平衡生产/消费速度不均衡带来的问题
能保证顺序,是并发安全的
1.4 并发安全Lock
可以解决共享内存的运行安全
1.5 WaitGroup
由于time.sleep()的时间不确定引入,waitgroup相当于计数器
开启协程+1,结束协程-1,主协程阻塞直至计数器为0
2 依赖管理
2.1 依赖管理演进
不同项目依赖的库版本不同,控制依赖库的版本
演变:GOPATH->Go Vendor->GoModule
GOPATH-环境变量
项目代码直接依赖src下的代码
弊端:无法实现多版本控制
Go Vender-项目目录文件夹
依赖寻址方式vendor->GOPATH
解决了多个项目需要同一个package的依赖冲突问题
弊端:无法控制依赖的版本
Go Module
通过go.mod文件管理依赖包版本
定义管理规则和管理项目依赖关系
Proxy-依赖分发
Go mod
go mod init 初始化,创建go.mod文件
go mod download 下载模块到本地缓存
go mod tidy 增加需要的依赖,删除不需要的依赖
GO111MODULE
GO111MODULE是 go modules 功能的开关。
GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
(1)当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
(2)当前文件在包含go.mod文件的目录下面。
3 测试
回归测试->集成测试->单元测试
从上往下,从低覆盖到高覆盖,从高成本到低成本
3.1 单元测试
规则
测试文件以_test.go结尾
函数命名TestXxx(* testing.T)
运行
go test [flags] [packages]
go test hello_test.go hello.go
查看覆盖率
--cover
go test hello_test.go hello.go --cover
这个命令用来查看运行过的代码占所有代码的比例,以了解测试用例的覆盖率。
3.2 Mock测试
目的是为了去除外部依赖,如DB, file, cache等。
原理
使用打桩函数对原函数做替换,使得不再依赖外部文件。
3.3 基准测试
测试性能
规则
测试文件以_test.go结尾
函数命名BenchmarkXxx(* testing.B)