后端模块一 ChapterⅢ Go进阶与依赖管理

57 阅读2分钟

1. 语言进阶

1.1 并发 并行

1.1.1 Goroutine

image.png

  • 线程可以并发创建协程
  • 通过go func()()这种方式创建携程

1.1.2 CSP Communicating Sequential Processes

image.png

  • go通过通信来共享内存

1.1.3 Channel 通道

image.png

  • 创建通道:make(chan 元素类型, [缓冲大小])
  • 分为有缓冲通道和无缓冲通道两种

1.1.4 Lock 并发安全

在Go语言中,sync.Mutexsync 包提供的一个互斥锁(mutex)类型,用于控制对共享资源的并发访问。互斥锁可以帮助避免多个goroutine同时访问同一资源,从而导致数据竞争或其他并发问题

1.1.5 WaitGroup

image.png

  1. Add(delta int) 方法

    • Add 方法用于通知 WaitGroup 有多少个goroutine将执行工作。delta 参数是一个整数,表示要增加的计数。如果 delta 是正数,它会增加 WaitGroup 的计数;如果是负数,它会减少计数。通常在启动goroutine之前调用 Add 方法,告诉 WaitGroup 将有多少个goroutine要等待。
    • 如果你不知道具体有多少个goroutine要启动,你可以在启动每个goroutine之前调用 Add(1)
  2. Done() 方法

    • Done 方法用于减少 WaitGroup 的计数。当一个工作goroutine完成其任务时,它会调用 Done 方法来通知 WaitGroup 它已经完成了工作。
    • Done 方法是 Add(-1) 的简写形式。
  3. Wait() 方法

    • Wait 方法使调用它的主goroutine阻塞,直到 WaitGroup 的计数归零。这意味着 Wait 方法会等待所有通过 Add 方法增加的goroutine完成它们的工作并调用 Done 方法。
    • 只有当 WaitGroup 的计数为零时,调用 Wait 方法的goroutine才会被唤醒并继续执行

2 依赖管理

2.1 依赖管理演进

image.png

2.1.1 GOPATH

image.png

  • 所有项目共用的环境

image.png

  • 弊端不同项目依赖不同的版本时,无法实现package的多版本控制

2.1.2 Go Vendor

image.png

  • 弊端:仍依赖项目源码,而不是版本

2.1.3 Go Module

image.png

2.2 依赖管理三要素

image.png

2.3 依赖配置

2.3.1 version

image.png

  • 生成两种版本号
  • 语义化版本:{大版本,互相不兼容}{函数新增}{bug修复等小改动}
  • commit版本:语义-时间戳-哈希码前12位

2.3.2 最低兼容

image.png

  • 项目编译时会选择最低的兼容版本

2.3.3 依赖分发-Proxy

image.png

  • GOPROXY 环境变量允许用户设置一个或多个Go模块代理服务器,这些服务器可以缓存和提供Go模块,从而加速模块的下载和更新过程。

image.png

  • 根据GOPROXY中URL逐个寻找依赖,如果都没有将会到第三方库回源

2.3.4 Go Get&Go Mod

image.png

image.png