这是我参与「第五届青训营」笔记创作活动的第2天。
一、本堂课重点内容:
本节课从首先并发编程的视角带我们了解了Go语言高性能的本质,学习了依赖管理的演进路线,并学习了常用的依赖管理的命令,最后学习了Go单元测试。
二、Go并发编程
线程和协程
线程是用户态,协程是内核态,一个线程可以跑多个协程
goroutine
Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,一个 goroutine 必定对应一个函数。
- 注意:使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。
创建一个简单的goroutine:
CSP
提倡通过通信共享内存而不是通过内存实现通信:
缓冲区 channel
缓冲区分为有缓冲通道和无缓冲通道
有缓冲通道可以让生产者更加“自由”,使得消费者消费变慢而对生产者产生的影响变小。
并发安全 lock
加锁可以保证线程、协程的并发安全性问题。
从图中可以发现在5个协程并发执行的时候,加锁很好的保证了并发安全性。
waitGroup
图中的wg.Add(5)意味着等待子协程done5次后,主协程恢复执行。
三、依赖管理
演进路线:
直接依赖与间接依赖
indirect表示间接依赖
GO PROXY
go proxy可以起到一个缓存的作用,在上游的依赖突然发生变化的时候,因为Proxy的存在,该变化不会直接影响项目的依赖,避免了这种情况下项目依赖版本报错的问题。
依赖分发的准则:
首先会到proxy1中寻找依赖,proxy1中没有则会去proxy2中去寻找,proxy2中也没有则会去源站寻找。
go get的使用
go mod的使用
四、测试
主要学习了单元测试、mock测试和基准测试。
- 单元测试中需要注意代码覆盖率的问题。
- mock测试通过打桩实现了不再依赖本地文件。
- 基准测试是指测试程序的运行性能以及耗费cpu的程度。
五、总结:
今天主要学习了GO并发编程、依赖管理以及测试相关的知识。今天同时也是青训营的第二天,希望自己可以把写博客这个好习惯坚持下去,及时复盘。