1. 语言进阶
1.1 并发 并行
1.1.1 Goroutine
- 线程可以并发创建协程
- 通过
go func()()这种方式创建携程
1.1.2 CSP Communicating Sequential Processes
- go通过通信来共享内存
1.1.3 Channel 通道
- 创建通道:
make(chan 元素类型, [缓冲大小]) - 分为有缓冲通道和无缓冲通道两种
1.1.4 Lock 并发安全
在Go语言中,sync.Mutex 是 sync 包提供的一个互斥锁(mutex)类型,用于控制对共享资源的并发访问。互斥锁可以帮助避免多个goroutine同时访问同一资源,从而导致数据竞争或其他并发问题
1.1.5 WaitGroup
-
Add(delta int)方法:Add方法用于通知WaitGroup有多少个goroutine将执行工作。delta参数是一个整数,表示要增加的计数。如果delta是正数,它会增加WaitGroup的计数;如果是负数,它会减少计数。通常在启动goroutine之前调用Add方法,告诉WaitGroup将有多少个goroutine要等待。- 如果你不知道具体有多少个goroutine要启动,你可以在启动每个goroutine之前调用
Add(1)。
-
Done()方法:Done方法用于减少WaitGroup的计数。当一个工作goroutine完成其任务时,它会调用Done方法来通知WaitGroup它已经完成了工作。Done方法是Add(-1)的简写形式。
-
Wait()方法:Wait方法使调用它的主goroutine阻塞,直到WaitGroup的计数归零。这意味着Wait方法会等待所有通过Add方法增加的goroutine完成它们的工作并调用Done方法。- 只有当
WaitGroup的计数为零时,调用Wait方法的goroutine才会被唤醒并继续执行
2 依赖管理
2.1 依赖管理演进
2.1.1 GOPATH
- 所有项目共用的环境
- 弊端不同项目依赖不同的版本时,无法实现package的多版本控制
2.1.2 Go Vendor
- 弊端:仍依赖项目源码,而不是版本
2.1.3 Go Module
2.2 依赖管理三要素
2.3 依赖配置
2.3.1 version
- 生成两种版本号
- 语义化版本:{大版本,互相不兼容}{函数新增}{bug修复等小改动}
- commit版本:语义-时间戳-哈希码前12位
2.3.2 最低兼容
- 项目编译时会选择最低的兼容版本
2.3.3 依赖分发-Proxy
GOPROXY环境变量允许用户设置一个或多个Go模块代理服务器,这些服务器可以缓存和提供Go模块,从而加速模块的下载和更新过程。
- 根据GOPROXY中URL逐个寻找依赖,如果都没有将会到第三方库回源