这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
GO并发编程
GO有两种并发编程的风格。
- groutine(协程)和通道。 他们支持通信顺序进程(Communicating Sequential Process,CSP),CSP是一种并发模式,在不同的执行体(goroutine)之间传递值,但是变量本身局限于单一的执行体。
- 共享内存多线程的传统模型。 go语言提倡通信共享内存而不是通过共享内存而实现通信。
通道分为有缓冲通道和无缓冲通道:
-
无缓冲通道 需要同步操作,即在无缓冲通道上发送操作将会阻塞,知道另一个goroutime在对应的通道上执行接收操作。
无缓冲通道 通过
ch := make(chan int)创建func TestTeName(t *testing.T) { naturals := make(chan int) squares := make(chan int) //管道的返回值为(bool, type) go func() { for x := 0; x < 10; x++ { naturals <- x } close(naturals) }() go func() { for x := range naturals { squares <- x * x } close(squares) }() for x := range squares { fmt.Println(x) } } -
缓冲通道 发送方直接将数据发送到通道中,只有当缓冲通道满了的时候才会阻塞
ch := make(chan int, 4)
管道的使用
- 发送语句。
ch <- x - 接收表达式。 x = <-ch
GO依赖管理
GOPATH
GOPATH将go get的依赖包全都下载到
go get下载最新版本的包到src目录下
项目代码直接依赖src下的代码
存在的弊端:无法实现package的多版本控制
GO Vendor
在项目目录下增加vendor文件,将所有依赖包以副本的形式存入项目路径下的vendor目录,解决了多个项目需要同一个package依赖的冲突问题
存在的弊端:当一个项目下依赖的包同时依赖于另一个不同版本的包时,会发生冲突(传递依赖)
GO Module
GO Module 通过go.mod配置文件来管理依赖,类似于maven下的pom文件,通过go.mod中require需要的包以及版本号,具体的包存放在GOPATH中的pkg目录下,类似maven仓库。
go.mod下的依赖包版本号:
- 语义化版本:
${MAJOR}.${MINOR}.${PATCH}如:1.2.0 (直接依赖) - 基于
commit伪版本 :Vx.0.0-yyyymmddhhmmss-abcdefgh1235版本号-年月日时分秒-校验码 (间接依赖)
\