关于GO的依赖管理与实践的青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
今天学习的比较抽象一点,本次笔记可能写的不怎么样,希望各位指出我的不足,麻烦各位了!
并发编程
并发与并行
学过操作系统的应该都知道这个,所谓并行,是指在同一时刻,有多条指令在多个处理器上同时执行;并发是指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,是的在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分为若干段,使得多个进程快速交替的执行。
线程与协程
- 协程:用户态,轻量级线程,栈KB级别。
- 线程:内核态,线程跑多个协程,栈MB级别。
- 一个线程里可以创建多个协程,可以用go关键字来开启协程,协程是由golang运行时进行管理的。
- (这点有待商榷)线程是CPU分配资源的最小单位,进程是操作系统调度执行的最小单位,但是老师并没有提到进程,所以我也不知道在Go里面是什么情况
通道
- 我个人理解有点类似操作系统中用于两个进程之间通信的方法之一:管道
- 通道是用来传递数据的一个数据结构,通过传递一个值来进行两个协程之间的同步和通信
- 通道分为无缓冲通道和有缓冲通道
- 无缓冲通道是指发送的数据不需要缓冲,可以直接到达通道的另外一端
- 有缓冲通道需要用户自己定义通道缓冲区大小,发送的数据会先缓冲到开辟的缓冲区,然后再发送过去
- 通过“<-”来发送数据,左边是发送的通道,右边是要发送的数据
并发安全问题
为了防止临界区的数据被多个协程争抢导致程序出现预期之外的错误,必须确保并发的时候的数据安全
互斥锁 Mutex
- lock上锁,只要有一个协程争抢到了临界区,并且上了锁,那么其他协程想要去访问临界区的数据就只能等解锁
- Unlock解锁
WaitGroup
- 类似信号量,需要提前设置好数量,add()函数
- Done(),每次有协程调用就-1,
- wait(),如果=0的话,协程就会阻塞
依赖管理
GOPATH
一个环境变量,里面存放3个子文件,分别为:
- bin:项目编译的二进制文件
- pkg:项目编译的中间产物
- src:项目源文件,项目代码直接依赖src下的代码 go get 下载最新版本的包到src目录下
- 弊端:无法实现package的多版本控制(这点我不是很理解,希望有大佬帮我解惑)
Go Vender
- 项目目录下增加vender文件,所有依赖包副本形式放在$ProjectRoot/vender
- 依赖寻址方式:vender->GOPATH
- 通过每个项目引入一份依赖的副本,解决了多个项目同时需要一个package依赖的冲突
- 弊端:更新项目的时候可能导致编译错误的冲突,无法控制依赖的版本
Go Moudle
- 通过 go.mod 文件管理依赖包版本
- 通过 go get/go mod 指定工具管理依赖包
单元测试
单元测试的质量决定了代码质量
单元测试的一些规则
- 所有测试文件都要以_text.go结尾
- 测试文件必须包含"testing"包
- 测试文件必须和待测试文件放在同一个包里
- 测试函数的名字必须以
Test开头,且跟在Test后面的后缀名必须以大写开头
assert
一个用来判断测试文件和被测试文件结果的一个函数
代码覆盖率
简单来说,就是你每次运行的时候,走到的代码占所有代码的比例,代码覆盖率越大越好,因为这就代表着很多的特殊情况都被考虑进去了,所以需要提高代码覆盖率来确保程序的可行性
项目实战
这部分我也不是很懂捏,鼠鼠我就不多写啦,希望有大佬能看透我的逞强,教教我!