[ Go 语言进阶与依赖管理 | 青训营笔记 ]

64 阅读2分钟

Day 2 Go 语言进阶与依赖管理

一、语言进阶

1、并发与并行

并发:多线程程序在单核cpu上运行
并行:多线程程序在多核cpu上运行 image.png

2、协程与线程

协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程(go语言一次可以跑上万个),栈MB级别 image.png
开启多个协程:在调用函数前加入go关键字 image.png

3、协程通信

①通过通信channel共享内存,传输队列能保证收发数据的顺序(提倡)
②通过共享内存实现通信,需要获取临界区的权限,不同的Gorountine间容易发生数据竞态的问题 image.png
channel:无缓冲通道,同步通道;有缓冲通道,通道容量,可以解决生产和消费速度不均衡带来的执行效率问题

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

image.png

4、并发安全Lock

临界区加锁和不加锁:不加锁会出现未知的结果,加锁通过对临界区的权限控制来保证并发安全,并发安全有概率引起数据错误(应避免共享内存非并发安全的读写操作image.png

5、waitgroup(实现并发同步)

①Add(delta int)
②Done() 执行结束 -1
③wait() 阻塞
image.png

二、依赖管理

1、gopath-弊端:无法实现package的多版本控制(版本冲突)

image.png

2、Go Vendor:每个项目引入一份依赖副本,弊端:不能清晰表示依赖版本的概念(又会出现版本冲突)

image.png

3、Go Module:定义版本规则和管理项目依赖关系

4、依赖管理:go.mod + Proxy + go get/mod

①依赖配置go.mod:选择最低的兼容版本 image.png
②依赖分发-Proxy:稳定可靠的依赖分发 image.png
③工具:go get/mod image.png
image.png

感悟:代码的高复用性是优秀代码必备的品质,而Go语言的包管理就为我们封装模块和复用代码提供了强有力的支撑