Go语言工程进阶 | 青训营笔记

51 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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.更新项目又可能出现依赖冲突,导致编译错误。 image.png

Go Module

通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
终极目标:定义版本规则和管理项目依赖关系

依赖管理三要素

配置文件,描述依赖(go.mod)

一个go.mod文件 image.png

依赖管理单元

模块路径

原生库

标记版本号

单元依赖

模块路径+版本号

依赖配置:

语义化版本: image.png V1.3.0
V2.3.0
基于commit伪版本: image.png V0.0.0-20220401081311-c38fb59326b7
indirect:
A->B->C
A->B 直接依赖
A->C 间接依赖
incompatible: 主版本2+模块会在模块路径增加/vN后缀
对于没有go.mod文件且主版本2+依赖,会+incompatible
依赖图:
选择最低的兼容版本

依赖分发

回源:
image.png 弊端:
无法保证构建稳定性
无法保证依赖可用性
增加第三方压力
Proxy:
image.png