Go语言进阶与依赖管理 | 青训营笔记

74 阅读2分钟

语言进阶

并发:多线程程序在一个核的CPU上运行

并行:多线程程序在多个核的CPU上运行

Coroutine

协程:用户态,轻量级线程,栈KB级别

线程:内核态,线程跑多个协程,核MB级别

CSP

CSP.png

Channel

channel.png

并发安全Lock

WaitGroup

依赖管理

背景

工程项目不可能基于标准库0~1编码构建

需要管理依赖库

Go依赖管理演进

不同环境(项目)依赖的版本不同

GOPATH

缺点:无法实现package的多版本控制

Go Vendor

缺点:

  • 无法控制依赖的版本
  • 更新项目后可能出现依赖冲突,导致编译错误

Go Module

通过go.mod文件管理依赖包版本

通过go get/go mod指令管理依赖包

目标:定义版本规则和管理项目的依赖关系

依赖管理三要素

  1. 配置文件,描述依赖(go.mod)
  2. 中心仓库管理依赖库(Proxy)
  3. 本地工具(go get/go mod)

依赖配置

依赖配置

go.mod

gomod.png

version

version.png

indirect

indirect.png

incompatiable

incompatible.png

依赖图

依赖分发

回源

直接使用版本管理仓库下载依赖:

  • 无法保证构建稳定性

    增加/删除/修改软件版本

  • 无法保证依赖可用性

    删除软件

  • 增加第三方压力

    代码托管平台负载问题

Proxy

go proxy 是一个服务站点,它会还源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用。

工具

go get

go get example.org/pkg

  • @update 默认
  • @none 删除依赖
  • @v1.1.2 tag版本,语义版本
  • @23dfdd5 特定的commit
  • @master 分支的最新commit

go mod

go mod

  • init 初始化,创建go.mod文件
  • download 下载模块到本地缓存
  • tidy 增加需要的依赖,删除不需要的依赖