Go 语言进阶与依赖管理 | 青训营笔记

21 阅读2分钟

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
)

在版本兼容时,将选择最低的兼容版本。