这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
并发 & 并行
Go可以充分发挥多核优势,高效运行。
Goroutine
这里老师的PPT文字有误。
- 线程:内核态,跑多个协程,栈MB级别。
- 协程,用户态,轻量级线程,栈KB级别。
Channel
- 利用缓冲,解决生产和消费的速度不均衡带来的消费问题。
- 生产快
- 消费慢
并发安全 Lock
并发安全问题不加锁产生的数据是未知的。
WaitGroup
将协程加入WaitGroup,可以很好的进行管理。
Go 依赖管理演进
GOPATH
- 环境变量 $GOPATH
- 项目代码直接依赖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 init,生成一个go.mod文件。- 执行
go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。
新项目
- 执行
go mod init项目名命令,在当前项目文件夹下创建一个go.mod文件。- 手动编辑
go.mod中的require依赖项或执行go get发现、维护依赖。