这是我参与「第五届青训营 」笔记创作活动的第2天
一、Go 语言进阶与依赖管理
- 并发编程
- 依赖管理
- 单元测试
- 项目实战
1、并发编程
并发多线程-单核
并行多线程-多核
1.1 Goroutin
新概念:协程:轻量级线程,Go的高性能并发
1.2 CSP
Go提倡通过通信来共享内存
Go保留通过共享内存实现通信
1.3 Channel 通道
make(chen 元素类型, 缓存大小)
make(chen int)//无缓冲
make(chen int, 2)//有缓存
补充:GO中的 defer
-
defer的词义:“延迟”,“推迟” 在go语言中,defer关键字来延迟一个函数或者方法的执行 -
defer的用法:defer function() -
如果多个defer函数:栈规则,先延迟后执行,后延迟先执行 -
defer函数传递参数的时候: defer函数调用时,就已经传递了参数数据了,只是暂时不执行函数中的代码而已 -
defer函数注意点: 当外围函数的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行。 当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回 当外围函数中的代码引发运行恐慌时,只有其中所有的延迟含税都执行完毕后,该运行时恐慌才会真正被扩展至调用函数
Go协程通过Channel传递消息 协程格式
go fun() {需要协程执行的代码}
1.4 并发安全 Lock
保护并发安全
保护x的内存,对其他协程锁定
lock.Lock()//
开放x的内存,对所有协程解锁
lock.Unlock()//
1.5 WaitGroup
type WaitGroup
Add(a)//计数器+1
Done()//计数器-1
Wait()//主协程阻塞,直到计数器0
2、依赖管理
2.1 GO依赖演进
GOPATH --> GO Vendor --> GO Module
1、不同环境依赖库版本
2、管理依赖库版本
2.1.1 GoPath
缺点:无法实现package的多版本控制
2.1.2 GO Vendor
缺点:package的依赖package会存在依赖库冲突,无法控制依赖版本
2.1.3 GO Module
依赖管理三要素
-
go.mod 文件管理依赖
-
go mod/go get 管理工具
-
Proxy 中心仓库
go.mod文件
MAJOR:版本间代码隔离(不兼容)
MINOR:版本增加功能(兼容)
PATCH:版本修复BUG(兼容)
在go.mod中//indirect 标记间接依赖 incompatible:对于没有go.mod且版本2+的依赖
2.3.5 Proxy 依赖分发
Proxy比源站(第三方,如GitHub)更安全可靠
Proxy相当于依赖库缓存