这是我参与「第五届青训营 」伴学笔记创作活动的第2天。
一、协程
启动协程的方法:go 函数名
time.Sleep阻塞,保证子协程执行完之前主线程不退出。
二、通道 Channel
1.无缓冲通道是同步通信,也称同步通道。
2.缓冲区满时会阻塞通道。
一个生产消费者例子:A子协程发送0~9数字,B子协程计算平方,主协程输出。
func CalSquare(){
src := make(chan int)
dest := make(chan int, 3)
go func(){
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func(){
defer close(dest)
for i := range src {
dest <- i * i
}()
for i := range dest {
println(i)
}
}
三、并发安全 Lock
可见不加锁可能会输出未知的结果。
四、WaitGroup
Sync包下,保证子协程执行完之前主线程不退出的方法。
改善上面的代码:
四、依赖管理
1.依赖管理演进
GOPATH -> Go Vendor -> Go Module
2.GOPATH
GOPATH是一个环境变量。
项目代码直接依赖src下的包。
弊端:无法实现多版本控制。
3.Go vendor
项目目录增加Vendor文件,存放依赖包的副本。
Vendor中没有,再去GOPATH找。
弊端:更新可能出现不兼容。
4.Go Module
通过 go.mod 文件管理依赖包版本。
通过 go get/go mod 指令工具管理依赖包。
选择最低的兼容版本。
三要素:
1.配置文件,描述依赖:go.mod
2.中心仓库管理依赖库:Proxy
3.本地工具:go get/mod
go.mod文件:
依赖配置-version
语义化版本:MAJOR.MINOR.PATCH
V1.3.0
MAJOR版本间不兼容。
基于commit伪版本:vx.0.0-yyyymmddhhmmss-abcdefgh1234
//indirect 间接依赖
+incompatible 可能存在不兼容
5.依赖分发-变量 GOPROXY
GOPROXY="proxy1.cn, proxy2.cn, direct"