青训营笔记2 - GO工程进阶
这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
概述
今天的课程内容主要分为下面四个部分:
- 并发编程
- 依赖管理
- 单元测试
- 项目实战 因为作者能力有限,记笔记也只能挑一些对本人来说较为重要或易忘的来记。
并发编程
-
goroutine
goroutine是Go语言中的轻量级线程实现,Go程序会智能地将goroutine中的任务分配给每个CPU。- 创建一个goroutine
go 函数名(参数列表)
- 创建一个goroutine
-
channel
channel是Go语言中一种特殊的类型。在任何时候,同时只能有一个goroutine访问通道,获取或发送数据。- 声明一个channel
var 通道变量 chan 通道类型 - 另一种方法
make(chan 通道类型[,通道缓冲区大小])设定缓冲区大小可以避免生产者速度比消费者快而通道阻塞的情况。
- 声明一个channel
-
sync.Mutex
Mutex是一种锁,当一个goroutine获得锁后,其他goroutine只能等待释放锁。用法类似于数据类型。- 声明锁
var lock sync.Mutex - 加锁
lock.Lock() - 解锁
lock.Unlock()
- 声明锁
-
WaitGroup
WaitGroup又称等待组,等待组内维护一个计数器- 声明等待组
var wg sync.WaitGroup - 改变等待组的计数
wg.Add(5)wg.Done()wg.Add(-1) - 进入阻塞状态
wg.Wait()使用Add(5)表示我们有 5个 子任务,然后起了 5个 协程去完成任务,主协程使用Wait()方法等待 子协程执行完毕,输出一共等待的时间。
- 声明等待组
func main() {
var waitGroup sync.WaitGroup
start := time.Now()
waitGroup.Add(5)
for i := 0; i < 5; i++ {
go func() {
defer waitGroup.Done()
time.Sleep(time.Second)
fmt.Println("done")
}()
}
waitGroup.Wait()
fmt.Println(time.Now().Sub(start).Seconds())
}
/*
done
done
done
done
done
1.000306089
*/
WaitGroup 一共有三个方法:
(wg *WaitGroup) Add(delta int)
(wg *WaitGroup) Done()
(wg *WaitGroup) Wait()
Add方法用于设置 WaitGroup 的计数值,可以理解为子任务的数量Done方法用于将 WaitGroup 的计数值减一,可以理解为完成一个子任务Wait方法用于阻塞调用者,直到 WaitGroup 的计数值为0,即所有子任务都完成
正常来说,我们使用的时候,需要先确定子任务的数量,然后调用 Add() 方法传入相应的数量,在每个子任务的协程中,调用 Done(),需要等待的协程调用 Wait() 方法。
依赖管理
主要介绍和推荐了go model的使用。具体安装见教程。具体使用和创建与其他依赖管理工具类似,不细写。
在对应项目目录下创建go model 文件后填入相关依赖,引入后会产生一个sum文件,对每个依赖产生对应的hash码,以防依赖的仓库主修改依赖后致使使用者出bug。
单元测试
因为学校上课有教过软件测试,感觉上课讲的例子太特殊,基准测试是类似单元测试的性能测试,其余并没学到太多内容。
项目实战
没有手打,只是跟着视频快速浏览了整个过程,感觉效果不是很好,这种项目感觉没有亲手打效果学习效果都不是很好,但由于时间关系为了跟进度没办法。