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

56 阅读3分钟

语言进阶

1.0并发Vs并行

并发:多线程程序在一个核的CPU上运行

image.png

并行:多线程程序在多个核的CPU上运行

image.png

GO可以发挥多核优势,高效运行

1.1Goroutine

image.png

协程:用户态,轻量级线程,栈KB级别

线程:内核态,线程跑多个协程,栈MB级别

协程的使用

快速打印hello groutine:0~hello goroutine:4

在调用函数func(j int)前加go这就可以为一个函数创建一个协程来运行

time.sleep(time.second)是为了保证子协程在执行完之前主协程不退出

image.png

1.2CSP

协程之间的通信

image.png

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

通过共享内存实现通信在一定程度上会影响程序的性能

1.3Channel

make(chan 元素类型,[缓冲大小])

无缓冲通道 make(chan int)

有缓冲通道 make(chan int,2)

image.png

Channel的使用

A 子协程发送0~9数字

B 子协程计算输入数字的平方

M 主协程输出最后的平方数

image.png

带缓冲的channel可以解决生产和消费速度带来的执行效率问题

1.4并发安全 Lock

对变量执行2000次+1操作,5个协程并发执行

对比加锁和不加锁两种情况的输出

image.png

image.png

加锁讲的是对临界区的权限的一个控制来保证并发安全

1.5waitGroup

go语言中可通过waitgroup实现并发任务的同步

image.png

计数器

开启协程+1;执行结束-1;主程序阻塞直到计数器为0

快速打印hello groutine:0~hello goroutine:4

image.png

依赖管理

2.0背景

image.png

工程项目不可能基于标准库0~1编码搭建

管理依赖库

2.1GO依赖管理演进

image.png

不同环境(项目)依赖的版本不同;控制依赖库的版本

2.1.1 GOPATH

环境变量$GOPATH

bin 项目编译的二进制文件

pkg 项目编译的中间产物

src 项目源码

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

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

GOPATH的弊端

image.png

V2无法兼容,无法实现package的多版本控制

2.1.2 GO Vender

项目目录下增加vender文件,所有依赖包副本形式放在$projectroot/vender

依赖寻址方式:vender——GOPATH

image.png

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题

GO Vender的弊端

无法控制的版本

更新项目又可能出现依赖冲突,导致编译错误 image.png

依赖的是项目源码,不能清晰的标识依赖版本

2.1.3 GO Module

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

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

终极目标:定义版本规则和管理项目依赖关系

2.2依赖管理三要素

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

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

2.3.1依赖配置-go.mod

image.png 依赖标识[Module Path] [Version/Pseudo-version]

2.3.2 依赖配置-version

1.语义化版本:MAJOR(可以不兼容).{MAJOR(可以不兼容)}.{MINOR(在minor下做到前后兼容)}.${PATHE}

2.基于commit伪版本:版本前缀-时间戳—12位哈吉马前缀

2.3.3依赖配置-indirect

image.png

A-B-C

A-B直接依赖

A-C间接依赖

没有直接依赖用indirect标识出来

2.3.4依赖配置-incompatible

image.png

主版本V2+模块会在模块路径增加/vN后缀

对于没有go.mod文件并且主版本V2+的依赖,会+incompatible

image.png

v1.4

选择最低的兼容版本

2.3.5 依赖分发-回源

image.png

无法保证构建的稳定性(加,改,删);无法保证依赖的可用性(删除软件);增加第三方压力

Proxy

image.png

2.3.6依赖分发-变量 GOPROXY

Proxy1——Proxy2——Direct(源站)

2.3.7工具-go get

image.png

2.3.8工具-go mod

image.png