这是我参与「第五届青训营 」伴学笔记创作活动的第 2天学习内容主要有四个部分:go的语言进阶 依赖管理 测试 项目实战。根据课程划分,本篇笔记主要记录前两个部分:Go语言进阶与依赖管理。
Go语言进阶
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
Go可以充分发挥多核优势,高效运行。
Go语言有高并发的特点,通过协程实现。
Goroutine
协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程跑多个协程,栈KB级别
协程的调度由Go语言本身实现,Go语言一次可创建上万个协程
使用协程的实例:快速打印hello goroutine :0-hello goroutine :4
要实现快速要求使用多个协程同时打印
开启协程:调用函数时,在函数前加上go关键字
CSP(Communicating Sequential Processes)
协程的通信
提倡通信共享内存而不是通过内存共享实现通信
channel
通道分为:无缓冲通道和有缓冲通道
make(chan 元素类型,[缓冲大小])
有缓冲通道也是一个典型的生产消费模型
并发安全Lock
数据竞态问题:存在多个gorountine同时操作一个内存(临界区)的情况
通过加锁保证并发安全
WaitGroup
三个部分:Add(delta int) Done() Wait()
实现优化
依赖管理
依赖:各种开发包,使用封装好的/已验证的开发组件/工具
在复杂项目开发时,关注业务逻辑,所以使用管理依赖库
Go依赖管理演进
GOPATH→Go Vendor→Go Module
不同环境(项目)依赖的版本不同
控制依赖库的版本
GOPATH
项目代码直接依赖scr下的代码
go get下载最新版本的安装包到scr目录下
弊端:无法实现package的多版本控制
Go Vendor
项目目录下增加wendor文件,所有依赖包副本放在文件中
解决了多个项目需要同一个package依赖的冲突问题
弊端:无法控制依赖的版本;更新可能出现依赖冲突,导致编译错误
Go Module
通过go.mod文件管理依赖包版本 达到目标:定义版本规则和管理项目依赖关系