这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一.并发操作
1.并发vs并行
- 并行 : 两个或多个事件在同一时刻发生(多个线程在多核cpu上运行)
- 并发 : 两个或多个事件在同一时间间隔发生(多个线程在单核cpu上运行)
2.协程vs线程
- 协程 : 用户态,轻量级线程,栈Mb级别
- 线程 : 内核态,线程跑多个协程,栈kb级别,操作比较废资源
3.开启协程
go+函数
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
func hello(i int) {
println("hello:" + fmt.Sprint(i))
}
4.CSP
go提倡通过通信共享内存而不是共享内存来实现通信
5.Channel通道
通道就是goroutine(协程)之间的通道。它可以让goroutine之间相互通信。
实例:
func main() {
//创建两个通道
src := make(chan int)
dest := make(chan int, 3)
//A子协程发送数组进通道
go func() {
//延迟关闭
defer close(src)
for i := 0; i < 10; i++ {
//通道接收
src <- i
}
}()
//B子协程发送数字平方
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
//主协程输出最后的结果
for i := range dest {
println(i)
}
}
6.锁
实际工程中会出现并发安全问题,下面是锁的相关操作
//定义锁
var lock sync.Mutex
lock.Lock()//加锁
//执行操作
lock.Unlock()//解锁
二.依赖管理
开发中的组件工具使用,通过sdk引入
项目依赖管理经过多次迭代
1.版本迭代
I.GOPATH
环境变量$GOPATH目录
- bin : 项目编译的二进制文件
- pkg : 项目编译的中间产物,加速编译
- src : 项目源码
II.Go Vendor
通过每个项目引入一份依赖副本,所有依赖包副本形式放在$ProjectRoot/vendor下
解决了多个项目需要用到同一package依赖冲突问题
III.Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖
2.依赖管理三要素
- 配置文件,描述依赖------go.mod
- 中心仓库管理依赖------Proxy
- 本地工具--------go get/go mod
3.依赖选择
选择最低的兼容版本(即向后兼容)
4.依赖分发
通过Proxy实现依赖下载的稳定性,类似中转站,类似计算机中的内存
依赖下载从Proxy中下载
如果proxy中不存在就在原站中下载
三.测试
1.测试类型
- 回归测试
- 集成测试
- 单元测试
从上到下,覆盖率上升,成本下将
2.单元测试规则
- 所有测试文件以_test.go结尾
- 测试函数命名: func TestXxx(*testing.T)
- 初始化逻辑放到TsetMain中
3.测试水平评估------代码覆盖率
运行 go test -cover
注:
- 一般覆盖率在50%~60%
- 测试分治相互独立,全面覆盖
- 单元测试粒度足够小