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
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实现了稳定可靠