[ Go语言进阶与依赖管理 | 青训营课程笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 3天
1.并发VS并行 Go可以充分发挥多核优势,高效运行
1.1 Goroutine
协程:用户态,轻量级线程,栈KB级别。 线程:内核态,线程跑多个协程,栈MB级别。 在函数前边加一个“go”关键字即可开启一个协程运行。 time.Sleep(time.Second)为了保证协程执行结束前主线程不退出。
1.2 CSP(Communication Sequential Processes)
提倡通过通信共享内存而不是通过共享内存而实现通信。
1.3 Channel
make(chan元素类型,[缓冲大小]) 无缓冲通道make(chan int) 有缓冲通道make(chan int,2)
1.4 并发安全Lock
对变量执行2000次+1操作,五个协程并发执行,预期值为10000,不加锁的话结果会未知,加锁的话结果为10000。
1.5 WaitGroup
WaitGroup有三个方法 Add(delta int) 计数器+delta Done() 计数器-1 Wait() 阻塞直到计数器为0
2.1 依赖管理
简单的单体函数只需要依赖原生SDK,而实际工程会相对复杂,我们需要更多关注业务逻辑实现,而其他的涉及框架、日志、driver及集合等的依赖会通过sdk方式导入,所以对依赖包的管理也很重要。
2.1.1GOPATH
bin 项目编译的二进制文件 okg 项目编译的中间产物,加速编译 src 项目源码
2.1.2GOPATH弊端
无法实现package的多版本控制
2.1.3Go Vendor及弊端
Vendor是当前项目中的一个目录,其中存放了当前项目依赖的副本。通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package的冲突问题。 无法控制依赖的版本。 更新项目又肯出现依赖冲突,导致编译出错。
2.1.4Go Moudle
通过go.mod文件管理依赖包版本。 通过go get/gomod指令工具管理依赖包。 终极目标:定义版本规则和管理项目依赖关系。
2.2 依赖管理三要素
1.配置文件,描述依赖 go.mod 2.中心仓库管理依赖库 Proxy 3.本地工具 go get/mod 类似于Java中的maven。