这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
一、本堂课重点内容:
- GO语言进阶
- 依赖管理
二、详细知识点介绍:
- GO语言进阶
1.4 并发安全 Lock
下面是加锁加1与不加锁加1的例子:
var{
x int64
lock sync.Mutex
}
func addWithLock(){
for i:=0;i<2000;i++{
lock.Lock()
x+=1
lock.Unlock()
}
}
func addWithoutLock(){
for i:=0;i<2000;i++{
x+=1
}
}
对每种方法使用5个goroutine各加2000次后,加锁的结果是预期的10000,未加锁的结果是8382,可见在多线程计算时对临界区进行保护的必要性。
func Add(){
x=0
for i:=0;i<5;i++{
go addWithoutLock()
}
time.Sleep(time.Second)
println("WithoutLock:",x)
x=0
for i:=0;i<5;i++{
go addWithLock()
}
time.Sleep(time.Second)
println("WithLock:",x)
}
//WithoutLock:8382
//WithLock:10000
1.5 WaitGroup
在之前的示例中,都在使用Sleep进行一个粗暴的阻塞;在go语言中可以使用WaitGroup进行优雅的阻塞。
计数器:开启协程+1;执行结束-1;主协程阻塞直到计数器为0。
func ManyGoWait(){
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()
}
上述代码为对1.1中示例的改良。
- 依赖管理
2.1 Go依赖管理演进
从旧到新的依赖管理工具为:GOPATH->Go Vendor->Go Module
自1.11版本后的Golang自带Go Module。
依赖管理解决的问题:
①不同环境(项目)依赖的版本不同
②控制依赖库的版本
2.1.1 GOPATH
在go文件夹下:
- bin:项目编译的二进制文件
- pkg:项目编译的中间产物,加速编译
- src:项目源码
src为常用文件夹。
在GOPATH方式下:
- 项目代码直接依赖sec下的代码。
- go get 下载最新版本的包到src目录下。
GOPATH弊端:
Project A和Project B依赖了同一个package的不同版本,GOPATH方法无法同时编译Project A与Project B。
问题:无法实现package的多版本控制
三、引用参考: