Day 2|青训营笔记
一,本堂课重点内容:
channel(通道)
前缀go创造一个协程
并发安全lock
sync
GOPATH-弊端
Go Vender
Go Module
依赖分发
依赖配置
工具
二,详细知识点介绍:
version
csp
通过通信共享内存
通过共享内存实现通信
channel(通道)
make(chan 元素类型,[缓冲大小])
无缓冲通道 (同步通道) 例:make(chan int)
无缓冲通道(超过容量通道阻塞) 例:make(chan int,2)
并发安全lock
多协程并发执行无锁可能会输出错误需要加锁
通过lock与unlock使用临界内存并释放内存
实践练习例子
package main
import (
"sync"
"time"
)
var (
x int64
lock sync.Mutex
)
func havelock() {
for i := 0; i < 2000; i++ {
lock.Lock()
x += 1
lock.Unlock()
}
}
func withoutlock() {
for i := 0; i < 2000; i++ {
x += 1
}
}
func main() {
x = 0
for i := 0; i < 500; i++ {
go havelock()
}
time.Sleep(time.Second)
println(x)
x = 0
for i := 0; i < 500; i++ {
go withoutlock()
}
time.Sleep(time.Second)
println(x)
}
WaitGroup
内部是一个计数器
for goroutine 中的执行顺序是 无序的
package main
import "sync"
func hello(i int) {
println(i)
}
func main() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
解释for与go变量名不同 把传进goroutine的变量范围变成goroutine之内
否则当主进程结束是协程还未结束无法输出协程内容 (参考segmentfault.com/a/119000004…)
for goroutine 中的执行顺序是 无序的
sync包主要是协程的操作以及并发安全管理
依赖管理
GOPATH-弊端
当两个项目依赖于某一package的不同版本无法实现package的多版本控制
Go Vender
依赖寻址方式:vendor-->GOPATH
**通过给每个项目引入一份依赖的副本,**使得多个项目需要同一个包的依赖冲突问题得到解决。
弊端
无法控制依赖的版本并且如果项目进行更新会导致编译错误。
Go Module
依赖管理三要素:
一,配置文件描述依赖 go.mod
二,中心仓库管理依赖库 Proxy
三,本地工具 go get/mod
依赖配置
version
语义化版本
- 不同的major版本表示不兼容的 API
- MINOR新增函数或功能向后兼容
- PATCH修改bug
基于commit伪版本。
基础版本 + 时间戳 + 校验码 (效验码由12位的哈希数字构成)
indirect
A->B->C
A->B A直接依赖于B。
A->C A间接依赖于C。
当一个项目依赖于其他多个项目,并且其他的多个项目也依赖于C项目的2个版本。那么最终编译时会选择C项目的最低兼容版本。
依赖分发
回源
缺点较多无法保证构建的稳定性,可用性。
Proxy
他是一个站点,会缓存站中的软件内容,构建时直接从站点拉取依赖。
稳定可靠。
工具
go get
go mod
四、课后个人总结
加强对go mod的使用