这是我参与「第五届青训营 」笔记创作活动的第2天
前文补充
- go是有闭包的
本节内容
- 并发|并行
- goroutine
- communicating sequential processes
- channel
- 并发安全:+lock
- waitgroup:类似于linux wait,但是提供了协程层面的接口
- 版本依赖
- GOPATH
- Go Vendor
- Go Module
- 依赖分发-GoProxy
- 测试
- 单元测试
- 基准测试
本节补充
- 提倡通信共享内存而不是共享内存实现通信
- 参考
- Go 语言并发模型的设计深受 CSP 模型的影响,我们简单总结一下为什么我们应该使用通信的方式来共享内存。
Do not communicate by sharing memory; instead, share memory by communicating.
- 首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计上提供更好的封装,让程序的逻辑更加清晰;
- 其次,消息发送在解耦方面与共享内存相比也有一定优势,我们可以将线程的职责分成生产者和消费者,并通过消息传递的方式将它们解耦,不需要再依赖共享内存;
- 最后,Go 语言选择消息发送的方式,通过保证同一时间只有一个活跃的线程能够访问数据,能够从设计上天然地避免线程竞争和数据冲突的问题。
上面的这几点虽然不能完整地解释 Go 语言选择这种设计的方方面面,但是也给出了鼓励使用通信同步信息的充分原因,我们在设计和实现 Go 语言的程序中也应该学会这种思考方式,通过这种并发模型让我们的程序变得更容易理解。到了现在我们其实可以讨论一些更加开放的问题,各位读者可以想一想下面问题的答案:
- 除了使用发送消息和共享内存的方式,我们还可以选择哪些方式在不同的线程之间传递消息呢
- 共享内存和共享数据库作为同步信息的机制是不是有一些相似性,它们之间有什么异同呢
- go.mod如何管理依赖
- 间接依赖 // indirect
- 主版本2+模块会在模块路径增加/vN后缀
- 对于没有go.mod文件并且主版本2+的依赖,会+incopatible
- 实际依赖不同版本的模块时,会选择可兼容的最小版本
- go测试工具