语言进阶
并发:多线程程序在一个核的CPU上运行
并行:多线程程序在多个核的CPU上运行
Coroutine
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,核MB级别
CSP
Channel
并发安全Lock
WaitGroup
依赖管理
背景
工程项目不可能基于标准库0~1编码构建
需要管理依赖库
Go依赖管理演进
不同环境(项目)依赖的版本不同
GOPATH
缺点:无法实现package的多版本控制
Go Vendor
缺点:
- 无法控制依赖的版本
- 更新项目后可能出现依赖冲突,导致编译错误
Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令管理依赖包
目标:定义版本规则和管理项目的依赖关系
依赖管理三要素
- 配置文件,描述依赖(go.mod)
- 中心仓库管理依赖库(Proxy)
- 本地工具(go get/go mod)
依赖配置
依赖配置
go.mod
version
indirect
incompatiable
依赖图
依赖分发
回源
直接使用版本管理仓库下载依赖:
-
无法保证构建稳定性
增加/删除/修改软件版本
-
无法保证依赖可用性
删除软件
-
增加第三方压力
代码托管平台负载问题
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 增加需要的依赖,删除不需要的依赖