2 工程实践
1 高性能
1.1 并发和并行
并发:多线程在一个核的CPU上运行,是表现出来
并行:真正有多核
并行可以理解为实现并发的一个手段
Go实现了一个并发高效调用的模型,
1.2 协程 Goroutine
1.2.1 线程
线程:比较占用系统资源,创建、切换等都需要内核参与
1.2.2 协程
协程:可以简单理解为轻量级的线程,处于用户态,由Go语言进行调度
线程上可以并发多个协程,且占用空间小,线程一次可以创建上万个协程
在函数前加上go关键字,就可以为一个函数创建一个协程。
go func(param type){
...
}(outer_param)
1.3 协程间通信
通道(Channel):连接协程,遵循先入先出,能保证收发数据的顺序
make(chan type, (size))
没有size参数表示这是一个无缓冲通道(同步通道)
解决同步问题,使用有缓冲区的有缓冲通道,典型生产消费模型
1.3.2 共享内存
互斥量加锁,会影响程序性能
Wait group,相较于之前直接time.Wait更优雅
2 管理依赖
2.1 版本变迁
GOPATH
无法实现package的多版本控制
Go Vendor
增加vendor文件夹,引入依赖副本,优先级高于GOPATH
无法控制依赖版本,更新可能出现依赖冲突
Go Module
定义版本规则和管理项目依赖关系
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
2.2 go.mod文件分析
单元依赖
indirect
incompatible
多版本依赖选择最低的兼容版本
依赖分发:依赖从哪里下载的问题产生了Proxy