Go 语言进阶与依赖管理 - 掘金 (juejin.cn)
线程和协程的区别的通俗说明 - 知乎 (zhihu.com)
为什么使用通信来共享内存 - 面向信仰编程 (draveness.me) (358条消息) 不要通过共享内存来通信,要通过通信来共享内存
这是我参与「第五届青训营 」伴学笔记创作活动的第 2天
Go高性能的本质
并发和并行
可以参考我写的这篇文章:
协程和线程
java中只有进程和线程,但是Go中多了一个协程
- 协程:用户态,轻量级线程, 栈KB级别。
- 线程:内核态,线程跑多个协程, 栈MB级别。
简单来说:线程要进内核,协程不需要
协程的例子
使用通信来共享内存 而不是 通过共享内存来通信
可以参考下边的文章:
为什么使用通信来共享内存 - 面向信仰编程 (draveness.me)
共享内存原理及实现通信过程_共享内存通信_几亿少女的梦的博客
使用通信来共享内存
通信共享内存是指在多个进程之间共享一块内存,这块内存可以用来存储和传递信息,从而实现进程间的通信。本质上是通过文件来存储和传递信息
通过共享内存来通信
共享内存实现通信则是指在多个进程之间共享一个文件,这个文件可以用来存储和传递信息,从而实现进程间的通信。本质上是通过在内存中共享
比起通过文件共享信息,内存更快,所以Go比java快
Channel的例子
waitgroup
Go的依赖管理
依赖管理的作用
- 工程项目不可能基于标准库0~1编码搭建
- 管理依赖库很麻烦(用过Python的都知道)
- 不同环境依赖版本不同,同一个项目在其他环境可能不能运行
Go的依赖管理的3个阶段
Go的依赖包管理主要分为3个阶段
- GOPATH
- Go Vender
- Go Module
GOPATH
GOPATH相对简单粗暴,直接下载最新的包,保存本地项目源码的目录下
GOPATH的弊端
Go Vender
Go Vender给每个项目增加了一个依赖的副本,解决了多个项目需要同一个包的问题
Go Vender的弊端
- 无法控制依赖的版本
- 更新项目可能导致依赖出错
Go Module
- 通过go.mod文件管理依赖包版本
- 通过goget/gomod指令工具管理依赖包
- 终极目标:定义版本规则和管理项目依赖关系
Go Module三要素
Go Module依赖配置
直接依赖和间接依赖
依赖图
Go会选择最低的兼容版本
Go Proxy
依赖分发-回源的问题
为了解决上述问题,Go使用了Proxy这个第三方服务站点来管理依赖。\
- Proxy会缓存源站的内容
- Proxy实现了稳定,可靠的依赖分发
Proxy的配置
项目从左往右依次寻找依赖,直到回到源站
类似于本地缓存——二级缓存——DB
本地工具1 go get
本地工具2 go mod