这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
Go语言入门 - 工程实践
并发编程
01.并发 vs 并行
1.1 Goroutine
协程是Go中的特殊"线程",轻量级的。栈KB级别。
要想开启一个协程,只需要在前面加上一个go就可以了,如下。
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
1.2 CSP
1.3 Channel
make(chan 元素类型,[缓冲大小])
无缓冲通道 -> make(chan int) -> 保持同步,同步通道
有缓冲通道 -> make(chan int,2)
生产者与消费者问题中,若生产者采用了无缓冲通道,那么消费者可以采用有缓冲通道来跟上生产者的速度。
1.4 并发安全 Lock
就是锁,用法同Java中的差不多。
1.5 WaitGroup
它有三个方法:
Add(delta int):计数器 + delta
Done:计数器 - 1
Wait:阻塞直到计数器为0
用来控制协程的结束,实际上这和信号量的思想一致,只不过这里是可以加delta自定义的数量,而信号量只能增一减一。
依赖管理
02.背景
其实和Java中的Maven一样,单靠原生库并不一定能够应对各种复杂的场景,为此将别人开发的好的可用的组件拿来用。
2.1 依赖管理演进
GOPATH -> Go Vendor -> Go Moudle
一定要注意版本问题!
GOPATH弊端:本地有多个项目都用同一个src,但是不同项目所要使用的源码版本不一致。
Vendor:就是多了一个文件夹,放一个副本,比如有一个func,A要1.0版本的,B要2.0版本的,若用GOPATH则不行,但用Vendor就可以将1.0复制一个副本放在文件夹,另一个2.0的直接在GOPATH中。这样不行,若版本更新了,如2.0 -> 3.0,那么2.0占用1.0,可是有项目要用1.0怎么办?
Go Moudle:和Maven大同小异,go.mod就是pom文件,Proxy就是Maven本地库,go get/mod 就是往Maven中写入依赖信息导入。//indirecr就相当于Maven中的标记灰色即不启用。选择最低的兼容版本。
Proxy解决依赖分发问题。
2.2 工具
单元测试
03. 测试
3.1 单元测试
规则
单元测试-覆盖率
Mock理解为代理模式 摆了。