GO语言进阶与依赖管理(二)|青训营笔记

60 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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进行优雅的阻塞。

image.png

计数器:开启协程+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。

image.png

依赖管理解决的问题:
①不同环境(项目)依赖的版本不同
②控制依赖库的版本

2.1.1 GOPATH
在go文件夹下:

  • bin:项目编译的二进制文件
  • pkg:项目编译的中间产物,加速编译
  • src:项目源码

src为常用文件夹。

在GOPATH方式下:

  • 项目代码直接依赖sec下的代码。
  • go get 下载最新版本的包到src目录下。

GOPATH弊端:

image.png

Project A和Project B依赖了同一个package的不同版本,GOPATH方法无法同时编译Project A与Project B。
问题:无法实现package的多版本控制
三、引用参考: