Go语言进阶 | 青训营笔记

54 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

Go语言并发编程

线程和协程

线程 是cpu调度的基本单位,内核态,线程可以并发的跑多个协程,其栈为MB级别。

协程 可以理解为轻量级、用户态的线程,其创建与调度由go语言本身完成,其栈为KB级别。

go语言一次可以创建上万个协程,这也是go语言适合 高并发场景 的原因所在。

Communication Sequential Process

通信顺序进程。

提倡 通过通信共享内存 而不是 通过共享内存实现通信。

channel通道使用: make(chan 元素类型, [缓冲大小])

并发安全lock

不加锁可能会输出未知的结果,通过对临界区权限的控制来解决并发安全问题,保证并发安全。

此问题比较难定位,所以在项目开发的过程中,应该尽量避免运用共享内存进行非并发安全的读写操作。

依赖管理

GOPATH

GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。二进制可执行文件放在 GOPATH/bin目录下,生成的中间缓存文件会被保存在GOPATH/bin 目录下,生成的中间缓存文件会被保存在 GOPATH/pkg 下。bin 和 pkg 目录的内容都可以由 src 目录生成。

弊端

在A和B依赖于某一package的不同版本的场景下,GOPATH无法实现package的多版本控制。

Go Vendor

Vendor是当前项目中的一个目录,其中存放了当前项目依赖的副本。在Vendor机制下,如果当前项目存在Vendor目录,会优先使用该目录下的依赖;如果项目不存在,会从GOPATH中寻找。

弊端

无法很好解决依赖包的版本变动问题以及一个项目依赖同一个包的不同版本的问题。

Go mod

通过go.mod文件管理依赖包版本

通过 go get/go mod指令工具管理依赖包

gopath和govendor都是源码副本方式依赖,没有版本规则概念,而gomod为了方便管理则定义了版本规则。

不同的MAJOR版本表示是不兼容的API,所以即使是同个库,MAJOR 版本不同也会被认为是不同的模块;

MINOR版本通常是新增函数或功能,向后兼容;而patch 版本般是修复bug;

而基于Commit的为版本,基础版本前缀是和语义化版本一样的:时间戳,也就是提交Commit的时间,最后是校验码,包含12位的哈希前缀。