这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
主题:go语言工程进阶
1.语言进阶——并发编程
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
Goroutine
协程:用户态,轻量级线程,栈MB级别。
线程:内核态,线程跑多个协程,栈KB级别。
提倡通过通信共享内存而不是通过共享内存而实现通信。
Channel
分为无缓冲通道和有缓冲通道
2.依赖管理
背景
三个阶段:gopath、go vendor、go module
不同环境(项目)依赖的版本不同
控制依赖库的版本
Go依赖管理演进
GOPATH
项目代码直接依赖src下的代码
go get 下载最新版本的包到src目录下
弊端:无法实现package的多版本控制
Go Vendor
项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
依赖寻址方式:vendor => GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端:1.无法控制依赖的版本
2.更新项目又可能出现依赖冲突,导致编译错误。
Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
终极目标:定义版本规则和管理项目依赖关系
依赖管理三要素
配置文件,描述依赖(go.mod)
一个go.mod文件
依赖管理单元
模块路径
原生库
标记版本号
单元依赖
模块路径+版本号
依赖配置:
语义化版本:
V1.3.0
V2.3.0
基于commit伪版本:
V0.0.0-20220401081311-c38fb59326b7
indirect:
A->B->C
A->B 直接依赖
A->C 间接依赖
incompatible:
主版本2+模块会在模块路径增加/vN后缀
对于没有go.mod文件且主版本2+依赖,会+incompatible
依赖图:
选择最低的兼容版本
依赖分发
回源:
弊端:
无法保证构建稳定性
无法保证依赖可用性
增加第三方压力
Proxy: