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

124 阅读3分钟

1语言进阶

1.1Goroutine

协程是一种用户态的轻量级线程,又称微线程,英文名Coroutine,协程的调度完全由用户控制。人们通常将协程和子程序(函数)比较着理解。 子程序调用总是一个入口,一次返回,一旦退出即完成了子程序的执行。

如何使用Goroutines:在函数或方法调用前面加上关键字go,您将会同时运行一个新的Goroutine。

1.2CSP(Communicating Sequential Process)

通过通信共享内存,而不是通过共享内存而实现通信.

CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程.

Channel 在 gouroutine 间架起了一条管道,在管道里传输数据,实现 gouroutine 间的通信.

1.3 Channel

通过make创建 分为无缓冲通道,有缓冲通道

1.4并发安全 Lock

加上锁可以保证并发安全 4个协程,每个执行2000次+1操作,没有锁的协程产生了操作丢失。 WithoutLock: 7883 WithLock: 8000

1.5WaitGroup

相当于一个计数器,那么它的作用是什么呢?记录当前正在执行的协程数,当正在执行的线程数不为 0 的时候,就需要进行一个等待。

通过Add可以添加一个协程数

执行Done函数,这会对协程数-1 。

Wait 函数,如果正在运行的协程不为0(存在正在运行的协程),那么就不结束主进程。

2依赖管理

2.1Go依赖管理演进

2.1.1GOPATH

项目代码直接依赖src下的代码

go get下载最新版本的包到src目录下

弊端:无法实现package的多版本控制。比如,不同的程序用到了同一个package,但是又是不同版本的,这时候,Gopath这种管理方式就无法处理了。

2.1.2GO Vendor

由于package版本的弊端,诞生了Go Vendor,相当于在每个项目下,建立了一个Vendor文件夹,里面存放项目中用到的package,当程序寻找依赖报的时候,先去Vendor中去寻找,如果找不到,再去Gopath下去寻找,这就避免了上面提到的package版本问题。

弊端:如果一个项目(A)用到的两个包(B和C),这两个包又依赖了同一个包D,但是用到的这同一个包但是版本不同且不兼容的包D,同样会出现如下无法控制版本的问题(即项目内出现此问题)

2.1.3GO MOUDULE

通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包

2.2 依赖管理三要素

1配置文件,描述依赖 go.mod

2中心仓库管理依赖库 Proxy

3本地工具 go get/mod

2.2.1 依赖配置-go.mod

image.png

2.2.2 依赖配置-version

语义化版本

基于commit伪版本

2.2.3 依赖配置-indirect

indirect间接依赖标识出来

2.2.4 依赖配置-imcompatible

当你的项目需要依赖一个新版本的模块,但新版本与先前版本有不兼容的更改时,你可以使用go mod -incompatible来在 go.mod文件中声明这个依赖。

2.2.5 依赖配置-依赖图

选择最低兼容版本

2.2.6 依赖分发-回源

中心仓库管理依赖库 Proxy实现了稳定可靠

2.2.7 依赖分发-变量GOPROXY

2.2.8 工具-go get

image.png

2.2.9 工具-go mod

image.png