这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
1.1 Goroutine
协程:用户态,轻量级线程,栈mb级别
线程:内核态,线程跑多个协程,栈kb级别
实现快速需要打开多个协程如go func(j int)在函数前面加go
1.2CSP
通过通信共享内存
1.3Channel
make(chan 元素类型,[缓冲大小])
例:
-
无缓冲通道
make(chan int)//同步通道 -
有缓冲通道
make(chan int, 2)//容量为2的缓冲通道
src := make(chan int)
dest :=make(chan int, 3)//缓冲通道为3
go func() {
defer ckose(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)
}
1.4并发安全Lock
避免对共享内存进行非法操作
1.5WaitGroup
Add(delta int) //计数器+delta
Done() //计数器-1
Wait() //阻塞知道计数器为0
var wg sync.WaitGroup
wq.Add( delta: 5)
for i := 0; i < 5; i++b {
go func(j int){
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
1.小结
- Goroutine
- Channel
- Sync
1.协程 使用go实现高并发的一个操作
2.通过 go实现共享内存
3.学习一些关键字实现操作
2.依赖管理
2.1 Go 依赖管理演进
共有三个阶段
- GOPATH
- GO Vendor
- Go Module(广泛应用)
2.1.1 GOPATH
工作区
bin 项目编译的二进制文件
pkg 项目编译的中间产物,加速编译
src 项目原码(直接依赖)
弊端:无法实现多版本控制
2.1.2 Go Vendor
增加了vendor文件,通过引入依赖文件,解决多项目使用同一个package的冲突问题
弊端:
1.无法控制依赖版本
2.更新项目有可能出现冲突
2.1.3 Go Module
通过go.mod文件管理 实现定义版本规则和管理项目依赖关系
三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod