这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
引言:个人原因,前来补作业了。今天文章是关于第二次Go语言的基础课程。
一、相关原理
- 并发和并行
并发是指多线程在同一个CPU核心上分片运行,a占用CPU核心先运行一片,然b再取代a运行b自己的内容...
并行就是我CPU有多个核心,以前一个人分时打工,现在有多个“工人”同时工作,大家一起并行。
Go的优势就在于,它拥有很多高性能的调度模型,可以充分发挥多核CPU的优势。
- 协程
众所周知,线程是进程的“儿子”。类似的,协程是更轻量化的线程。一个协程的调用只是Kb级别的,而线程却是Mb级别的调用。因为协程是在用户态的情况下创建的,不需要过多的系统操作(指线程的内核态操作
- CSP
Communicating Sequential Process不同的协程之间的通信顺序也是值得注意的,这里分为两种方式。
通过通信共享内存:发消息,指定谁是谁,哪里应该存什么。通过共享内存实现通信:要发消息那就在一个大家都有机会看到的区域放置信息,大家都有机会看。
对于第二种情况就有说法了,你不能我一个协程发上来了,所有的协程都同一时间给很多个协程读写吧。这时候我们就需要引入锁的概念。
像这样图中所示的“通道”也是一种数据类型,通过
make(chan int (Num))
其中,有Num的赋予就是带Num大小的缓冲通道。
- Wait Group方法介绍
- 依赖管理
依赖是什么应该不用科普了,我们在工程的进行中或多或少会慢慢遇到依赖之间冲突从而导致编译或者很多奇奇怪怪的错误的出现。这显然不是我们希望看到的。
依赖管理也经历了三个阶段的发展,Go Path -> Go Vendor -> Go Moudule.
依赖管理需要三个要素:
1. 配置文件 go.mod
2. 中心仓库管理依赖库 Proxy
3. 本地的工具 go get/mod
比如
值得注意的是,Go mod管理的一个规则是,会选择最低的兼容版本。下图是个好东西,写完代码多用tidy。
- 依赖分发
其实依赖分发主要针对的就是比如我们公司要去拉取GitHub上的代码,不可能每个人都去Github上下载一遍。假如大家都去集火拉取,那Github崩了咋办?(虽然一般不会~
那么用什么应对?公司自己建立一个自己建立的平台,拉取并且记录。这样还可以应对“作者删库的时间,或者作者突然黑化了给你搞个后门”。
- 测试是开发的最后一道保险。
测试由上至下分为回归、集成和单元测试。他们的测试成本和测试覆盖率都依次上升。
进行测试的一些规则
1. 测试文件均以 _test.go 结尾
2. 测试函数 TestXxx(*Testing.T)
3. 用提供的TestMain测试Main函数时,可放入初始化逻辑
一个例子:
二、练习
- 快速打印
代码如下:
值得注意的是此处的阻塞是干什么的?以及如何优化的问题。 显而易见,当一个协程创建并且执行完成后应该干什么呢?我们为了保证安全和资源的节省,不妨让他们统统sleep。当然了,这里直接sleep并不是一个优雅的写法。当创建的协程到上万个,简单的sleep一定不是个好主意。
- Channel 一个协程负责输出0-9另一个需要接收到这0-9的数字,并且将他们平方、求和。这里显然就需要通道这个概念的介入。是上边提到的通过内存通信的方法。
- 并发、锁
显然调用到枷锁的方法可以保证协程之间的有序工作,从而保证了数据的准确。
- 单元测试-Mock
设定:Mock一下 = 对打桩实例 n 进行打桩。打桩就是用另一个实例替换之前的实例,则原先的实例是 “打桩” 的。 下面的Patch就是用来替换原先实例的函数。
【不再强依赖测试文件,自己造需要的条件】
func TestProcessFirstLineWithMock(t *testing.T){
monkey.Patch(ReadFirstLine, func() string {
return "liae110"
})
defer monkey.Unpatch(ReadFirstLine)
Line := ProcessFirstLine()
assert.Equal(t," ine000",line)
}
monkey https://github.com/bouk/monkey
三、总结
- 测试部分没什么内容,大家看视频学习即可
- 今天主要分享了关于Go的一些依赖管理基础知识
- 新人有错误,请大佬们指出~
四、引用参考
- 字节青训营课程