“这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天”
1、语言进阶---并发编程
1 ) 并发VS并行;
go可以充分发挥多核优势,高效运行;
1.1 协程 Goroutine
- 创建协程语法:
1.2 CSP(communicating Sequential Process)
-通过通信共享内存,而不是通过共享内存而实现通信!
1.3 Channel,通道
- 创建通道
- make(chan 元素类型,缓冲大小)
1.4 并发安全Lock
- 多个协程对相同变量增减,需要锁保证并发数据安全
1.5 WaitGroup
之前都是sleep等待协程执行完毕再结束主线程;
采用waitgroup可以更加优雅的解决这个问题;
2、依赖管理
背景:
在开发项目中,学会站在巨人肩膀上,利用已经封装好的、经过验证的开发组件或工具来提升自己的研发效率;
2.1 Go依赖管理演进
2.1.1 GOPATH
GPOPATH是go语言支持的一个环境变量,value是go项目的工作区(文件夹地址);
通常都放入src文件夹中;
缺点:
某一个package不同版本,而src只有一个版本存在,AB项目无法都编译通过
2.1.2 Go Vendor
项目目录增加vendor文件夹;存放当前项目依赖副本;
首先查找vendor目录,找不到再去GOPATH;
但vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题,
2.1.3 Go Module
- go 1.11实验性引入,go 1.16之后默认开启;
2.2 依赖管理三要素
2.3 依赖配置
2.3.1 依赖配置-go.mod
1 )模块路径标识一个模块,可以使github仓库地址,
如果项目子包想被单独引用,需要通过单独的go init mod管理;
最下面是单元依赖,每个依赖单元用模块路径+版本唯一标识
2.3.2 依赖配置 version
- 1)语义化版本
不同的MAJOR版本表示是不兼容的API,所以即使是同一个库,MAJOR版本不同也会被认为是不同的模块;
MINOR 版本通常是新增函数或功能,向后兼容;
PATCH 版本一般是修复bug;
- 2)commit伪版本
基础版本前缀是和语义化版本一样的;
时间戳(yyyymmddhhmmss),也就是提交Commit 的时间,
最后是校验码(abcdefabcdef),包含12位的哈希前缀;
每次提交commit后Go都会默认生成一个伪版本号。
2.3.3 依赖配置 indirect
2.3.4 依赖配置 incompatible
- 主版本2+模块会在模块路径增加/N后缀,这能让go module按照不同的模块来处理同一个项目不同主版本的依赖。
- 由于gomodule是1.11实验性引入所以这项规则提出之前已经有一些仓库打上了2或者更高版本的tag了,为了兼容这部分仓库,对于没有go.mod文件并且主版本在2或者以上的依赖,会在版本号后加上+incompatible 后缀
2.3.5 依赖分发 回源
- 直接依赖github不安全,原作者更改会影响自己代码功能;
2.3.6 依赖分发 变量 GOPROXY
2.3.7 工具 go get
2.3.8 工具 共mod
参考资料来源:Go 语言入门 - 工程实践 .pptx - 飞书云文档 (feishu.cn)