本文对第二节课程:go语言进阶与依赖管理,中的知识点进行了简要的梳理。
1.并发VS并行
- 并发:多线程程序在一个核的cpu上运行
- 并行:多线程程序在多个核的cpu上运行
- Go可以充分发挥多核优势,高效运行
2.Goroutine协程
- 协程:用户态,轻量级线程,栈KB级别
- 线程:内核态,线程跑多个协程,栈MB级别
- 只需在函数前加go关键字
3.CSP协程之间通信
- 提倡通过通信来共享内存而不是通过共享内存来实现通信
- channel通道
- 引用类型,创建需通过make关键字
- 根据缓冲大小分类
- 无缓冲通道 make(chan int)
- 是同步通道
- 有缓冲通道 make(chan int, 2)
- 考虑消费速度小于生产速度
- 无缓冲通道 make(chan int)
- 并发安全 Lock
- 临界区
- WaitGroup 实现并发任务的安全
- 内部实现一个计数器
- Add(delta int) 计数器+delta
- Done 计数器-1【每个任务完成时】
- Wait 【阻塞】直到计数器为0,0表示所有并发任务已完成
- 内部实现一个计数器
4.依赖管理
- 发展:gopath->go vender->go module
- 环境变量GOPATH
- 包括
- bin 项目编译的二进制文件
- pkg 项目编译的中间产物,加速编译
- src 项目源码
- 弊端
- 两项目都依赖某个pkg,但需要pkg的不同版本
- 无法实现package的多版本控制
- 包括
- Go Vender
- 项目目录下增加vender文件:所有依赖包副本形式放在$ProjectRoot/vender
- 依赖寻址方式
- 先找vender,若没有,再找gopath
- vender=>GOPATH
- 通过每个项目引入一份依赖的副本,解决问题
- 弊端
- 若项目分别依赖pkg A 和B,A依赖pkg C 的v1版本,B依赖pkg C 的v2版本,两版本不兼容,出问题
- 无法控制依赖的版本
- 更新项目又可能出现依赖冲突,导致编译出错
- Go Module
- 通过 go.mod文件 管理依赖包版本
- 通过go get/go mod指令工具 管理依赖包
- 目标:定义版本规则和管理项目依赖关系
- 依赖管理三要素
- 1.配置文件,描述依赖 go.mod
- 2.中心仓库管理依赖库 Proxy
- 3.本地工具 go get/mod
- 依赖配置
- -go.mod
- -version
- 语义化版本
- 基于commit伪版本
- 关键字:indirect
- 依赖图
- 依赖分发 【去哪里下载依赖
- Github, SVN,不稳定
- Proxy ,缓存,稳定可靠
- 变量GOPROXY
- 工具
- -go get
- go get example.org/pkg
- -go mod
- init:初始化,创建go.mod文件
- download:下载模块到本地缓存
- tidy:增加需要的依赖,删除不需要的依赖
- -go get
通过本次课程的学习,我对go语言有了更加深入的理解,在之后的实践中也会根据所学内容进行项目管理。