这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
Go语言进阶与依赖管理 | 青训营笔记
1.1 Goroutine
- 协程(Goroutine):用户态,轻量级线程,栈KB级别
- 线程:内核态,线程跑多个协程,栈MB级别
1.2 CSP(Communicating Sequential Processes)
提倡通过通信共享内存而不是通过共享内存而实现通信
1.3 Channel
make(chan 元素类型, [缓冲大小])
- 无缓冲通道
make(chan int) - 有缓冲通道
make(chan int, 2)
1.4 并发安全(LOCK)
通过对临界区资源访问权限的控制,来保证并发的安全
1.5 WaitGroup
计数器:开启协程+1;执行结束-1;主协程阻塞直到计数器为0。
2.1 依赖管理
GOPATH → Go Vendor → Go Module
- 不同环境(项目)依赖的版本不同
- 控制依赖库的版本
- GOPATH弊端:无法实现package的多版本控制,如同一个src文件下,代码A使用了Pkg V1,代码B使用了Pkg V2,此时可能导致冲突
- Go Vendor:项目目录下增加vendor文件,所有依赖包副本形式放在
$ProjectRoot/vendor,依赖的寻址方式为vendor => GOPATH。- 优点:通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
- 弊端:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译出错。
- Go Moudle:通过
go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包,其终极目标为定义版本规则和管理项目依赖关系。
2.2 依赖管理三要素
- 配置文件,描述依赖
go.mod - 中心仓库管理依赖库
Proxy - 本地工具
go get/mod
2.3 依赖分发-Proxy
2.4依赖分发-变量GOPROXY
GOPROXY = "https://proxy1.cn, https://proxy2.cn, direct" —— 服务站点URL列表, "direct"表示源站