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

92 阅读2分钟

[ 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。