1并发VS并行
发:多线程程序在一个核的cpu上运行(在一段时间内同时发生
行:多线程程序在多个核的cpu上运行(在同一时刻内同时发生 Go可以充分发挥多核优势,高效运行
1.1Goroutine
协程:用户态,轻量级线程,栈KB级别(Go语言可以一次性创造上万个协程,高效运行原因之一)
调用协程:调用函数的时候加上go关键字即可
线程:内核态,线程跑多个协程,栈MB级别 1.2CSP(communicating Sequential Processes)
协程之间的通信: 通过通信共享内存 通过共享内存实现通信 提倡通过通信共享内存而不是通过共享内存而实现通信
1.3channel
是引用类型 使用make关键字来构造
语法:make(chan 元素类型, [缓冲大小]) //缓冲大小表示通道中能存放多少元素
无缓冲大小:make(chan int) //会使发送Goroutine和接收Goroutine同步 也叫同步通道
有缓冲大小:make(chan int,2)
1.4并发安全Lock
1.5WaitGroup
2依赖管理
背景:
- 工程项目不可能基于标准库0~1编码搭建
- 管理依赖库
2.1Go依赖管理演进
GOPATH -> Go Vendor -> Go Module
- 不同环境(项目)依赖的版本不同
- 控制依赖库的版本
2.1.1GOPATH
GOPATH是Go语言支持的一个环境变量,value是Go项目的工作区。
目录有以下结构:src(存放Go项目的源码);pkg(存放编译的中间产物,加速编译);bin(存放Go项目编译生成的二进制文件
- 环境变量$GOPATH
- 项目代理直接依赖src下的代码
- go get下载最新版本的包到src目录下
GOPATH的弊端:在GOPATH管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这显然不能满足我们项目的需求。(无法实现package的多版本控制)
2.1.2Go Vendor
- 项目目录下增加vendor文件,所有依赖包副本形式在$ProjectRoot/vendor
- 依赖寻址方式:vendor => GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
Go Vendor的弊端:
- 无法控制依赖的版本
- 更新项目又可能出现以来冲突,导致编译出错
2.1.3Go Module
- 通过go.mod文件管理依赖包版本
- 通过go get/go mod指令工具管理依赖包
终极目标:定义版本规则和管理项目依赖关系
2.2依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
如果你熟悉Java,可以类比一下Maven
2.3.1依赖配置-go.mod
2.3.2依赖配置-version
- 语义化版本
- 基于commit伪版本
2.3.3依赖配置-indirect
2.3.4依赖配置-incompatible
- 主版本2+模块会在模块路径增加/vN后缀
- 对于没有go.mod文件并且主版本2+的依赖,会+incompatible