这是我参与「第五届青训营」笔记创作活动的第3天,在今天呢主要学习的是Go语言的一些进阶知识,并讲解了依赖管理和测试的相关知识,最后通过一个小项目进行巩固。
一、本堂课的重点内容
今天课程的主要框架为:
-
语言进阶
- Go语言的并发编程
-
依赖管理
- 背景
- Go依赖管理演进
- Go Module实战
-
测试
- 单元测试
- Mock测试
- 基准测试
-
项目实战
- 需求设计
- 代码开发
- 测试运行
二、详细知识介绍
2.1为什么要进行并发编程
当科技的飞速发展,仅仅只是仅仅只是使用单线程进行的任务处理已经不能够满足当今的社会需求。并发编程意味着能够提高CPU的利用率,从而使得程序处理数据的能力更加的快,这就好比一个人处理一个问题,和多个人处理同一个问题一样,很明显在大多数的情况下,多个人处理同一个问题的速度明显要快很多。这就是为什么要学习并使用并发编程的原因。
2.2并发和并行两个分不清的概念
对于并发和并行的区别,实际上是很容易混下的。因为从词语解释的角度,两者都有同时的意思。但实际上在计算机操作系统的术语之中两者是有一定区别的。
并发指的是如图所示这样,多线程程序在一个核的CPU上运行,也就是说多线程程序在规定的时间内具体实现是交替运行的,而展现出来的则是由于程序与程序之间切换的时间很短呈现出的一种假的并行运行情况 :
并行指的是如图所示这样,多线程程序在多个核的CPU上运行,多线程程序在同一时间内,在不同的核上执行:
2.3协程(Go语言之中叫Goroutine)
Go语言的Goroutine可以解决当多个任务出现的时候自动分配CPU进行执行,那么应该如何使用Go语言创建一个Goroutine呢?答案是通过Go关键字加上对应的需要执行的函数进行即可,如下述代码所示:
func hello(i int){
println("Hello goroutine: "+fmt.Sprint(i))
}
func HelloGoRoutine(){
for i:=0;i<5;i++{
go hello(i)
}
time.Sleep(time.Second)
}
&ensp; 通过上述代码即可创建5个goroutine同时执行,为了避免主程序执行完后依旧有子任务还没有执行完,这里使用了一个time方法进行阻塞。
2.4解决多个协程之间进行通讯的方法——CSP(Communicating Sequential Processes)
对于像C/C++这样的语言在处理多线程之间的通信问题的时候,使用的是共享内存的方式,当多个线程要处理多个任务并要从共享内存之中获得数据的时候则必须采用锁的方式对内存进行保护,否则会出现意想不到的错误。而 Go语言在保留了这种共享内存的方法的基础上额外提出了一种叫 CSP 的方式,采用通道来建立协程之间的通信,如图所示,当然在Go语言之中提倡通过通信共享内存而不是通过共享内存而实现通信。
2.5chan关键字实现通道功能
如果要实现通道功能,则只需要使用chan关键字即可,具体的用法如下:
// 格式为make(chan 元素类型,[缓冲大小])
// 1.创建无缓冲通道
scr := make(chan int)
// 2.创建有缓冲通道(2个)
del := make(chan int ,2)
创建出来的具体化效果如图所示:
创建出来该如何使用呢,如下面的代码所示:
// 使用匿名函数创建协程并将数据移动到scr通道
go func(){
defer close(scr)
for i := 0;i<10;i++{
scr <- i
}
}()
// 使用匿名函数创建协程并将scr通道的中的数据的平方移动到 del通道
go func(){
defer close(del)
for i := range scr{
del <- i*i
}
}
// 打印del通道中的数据
for i:= range del{
println(i)
}
defer是Go语言中的延迟执行语句.
2.6 WiatGroup 解决不知道该停多久的问题
在执行多线程的时候,我们是不知道每个程序需要执行多少时间才能够终止的,这个时候就需要使用等待组来解决这个问题。
三、个人总结
在今天的学习之中,学会了一个新的概念叫协程,并知道了如何在Go语言之中如何使用协程,以及解决协程之间的通信问题。