Go并发
goroutine
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,栈MB级别
CSP
通过通信共享内存。
channel
对于channel:
+ 有缓冲通道 make(chan int, 2)
+ 无缓冲通道 make(chan int)
若采用无缓冲通道可能产生"all goroutines are asleep - deadlock!"错误。默认情况下,通信是同步且无缓冲的。这种特性导致通道的发送/接收操作,在对方准备好之前是阻塞的。
- 对于同一个通道,发送操作在接收者准备好之前是阻塞的。如果通道中的数据无人接收,就无法再给通道传入其他数据。新的输入无法在通道非空的情况下传入,所以发送操作会等待channel再次变为可用状态,即通道值被接收后。
- 对于同一个通道,接收操作是阻塞的,直到发送者可用。如果通道中没有数据,接收者就阻塞了。
可以将默认的通道替换成缓冲通道来解决问题。
依赖管理
GOPATH
- bin 项目编译的二进制文件
- pkg 项目编译的中间产物,加速编译
- src 项目源码 项目代码直接依赖src下的代码; go get下载最新版本的包到src目录下。 问题:无法实现package的多版本控制。
GO VENDOR
项目目录下增加vendor文件。通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。 问题:无法控制依赖的版本;更新项目又可能出现依赖冲突,导致编译出错。
GO MODULE
通过go.mod文件管理依赖包版本;通过go get/go mod指令工具管理依赖包。
go.mod
// 依赖管理基本单元
module github.com/Moonlight-Zhao/go-project-example
// 原生库
go 1.16
// 单元依赖
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.3.0 // indirect
gorm.io/gorm v1.23.4 // indirect
)
在版本兼容时,将选择最低的兼容版本。