一、语言进阶 - Go并发编程
- Goroutine: 实现了并发性能极高的调度模型,通过高效调度,可以最大限度的利用计算资源,充分发挥多核计算机的优势。Go语言利用协程,而不是线程。协程比线程要轻量很多,保证程序可以快速运行。
- Channel: 提倡通过通信共享内存而不是通过共享内存而实现通信,但是同时保持着通过共享内存而实现通信的机制。
- Sync: 通过共享内存而实现通信需要利用对临界区权限的控制来保证平发安全(Lock)。
可以通过waitgroup来实现并发任务的同步,本质上是维护了一个计数器。开启协程+1;执行结束-1;主协程阻塞知道计数器为0。
二、依赖管理
在开发项目中需要利用其他人已经开发好的开发组件来提升自己的研发效率
依赖管理目标:1. 不同环境(项目)依赖的版本不同 2. 控制依赖库的版本
GOPATH
Go语言支持的一个环境变量。项目代码直接依赖src下的代码,go get下载最新版本的包到src目录下。无法实现package的多版本控制。
Go Vendor
项目目录下增加vendor文件,所有依赖包副本形式放在 $ProjectRoot/vendor,如果vendor中没有,利用GOPATH寻找。 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。但无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译出错。
Go Module
通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包。
依赖管理三要素
- 配置文件,描述依赖(描述依赖了哪些包,如何去定位)--- go.mod
- 中心仓库管理依赖库 --- proxy
- 本地工具 --- go get/mod
go.mod
记录依赖管理基本单元、原生库和单元依赖。
语义化版本中,不同的major版本可以不兼容,但是同一个major下的minor版本要兼容。Patch主要是bug修复
proxy
proxy会缓存原站中的软件内容,通过proxy可以保证依赖的稳定性,在使用了proxy之后,会直接从proxy中取依赖
go get/mod
可通过不同关键词实现不同功能
三、个人思考
通过这节课,我更加深入的意识到了每一个功能的实现都是通过不断地改进得到的。同时,人们需要开发很多不同的工具才能保证这些功能在复杂的情况下都可以按照预期运行。