语言进阶与依赖管理
这是我参与【第五届青训营】伴学笔记创作活动的第二天
**学习Go,马上起飞!!!**
为什么GO的性能如此之好?
- GO可以充分发挥多核优势,高效运行,GO语言就是为了高并发而诞生的!!!
- 线程:内核态,线程跑多个携程,栈MB级别;一个线程可以创建上万左右的协程。
- 协程:用户态,轻量级线程,栈KB级别;
携程
如何创建携程
在函数前加上go标签即可,如例:
func HelloGoRoutine(){
for i:=0;i<5;i++{
go func(j int){
hello(j)
}(i)
}
time.Sleep(time.Second)
}
携程之间如何通信
左图是通过通道共享内存,Goroutine是构成并发的执行体,通道相当于传输队列,遵循着先入先出的规则,能保证收发信息的顺序。
右图是通过共享内存实现通信,需要使用互斥量对资源进行加锁,不同的Goroutine会相互争夺资源,会影响程序性能。
通道
通道分为有缓冲通道和无缓冲通道,通过关键字make创建。
- 无缓冲通道 make(chan int),发布和接收的Goroutine同步化
- 有缓冲通道 make(chan int,2),缓冲区有空余时,才能进行传输信息
依赖管理
我们要站在巨人的肩膀上
Go的依赖管理演变
目前广泛运用的是Go Moudle
GPPATH
定义:
- 环境变量 $GOPATH
- 项目代码直接依赖src下的代码
- go get下载最新版本的包到src目录下
弊端:项目A和项目B依赖于某一package的不同版本,无法实现package的多版本控制
Go Vendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式:vendor=>GOPATH
解决了每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译错误。
Go Module
- 通过go.mod文件管理依赖包版本
- 通过go get/go mod指令工具管理依赖包
依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖 proxy
- 本地工具 go get/mod
依赖配置
若有C1.5版本,仍然会选择C1.4版本,因为只要选择调用的最新的兼容版本