Go语言实践-第二课笔记 | 青训营笔记

101 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

在第二节课中,老师重点为我们介绍了四个部分的内容。第一部分,老师从并发的角度讲述了Go语言高性能的本质。第二部分,老师介绍了Go语言依赖管理的演进路线。第三部分,老师主要讲述了测试方面的知识。最后是一个项目实战的内容。

Go语言并发

串性,并行和并发

串行:按序执行程序,比如我们读书的过程,就是一个串行的过程。

并行:同一时刻执行多个任务,比如多线程程序在多个核CPU上运行,并行是几个任务在同一时刻互不干扰的同时执行。

并发:同一时间段执行多个任务,比如多线程程序在一个核的CPU上运行,任务彼此穿插着进行。并发允许事务之间的彼此干扰,并不要求在同一时刻执行。

并行和并发.PNG

Goroutine

Go中有进程,线程和协程的概念。

进程:程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。

线程:操作系统基于进程开启的轻量级进程,是操作系统调度执行的最小单位。内核态,轻量级线程,栈MB级别。

协程:用户态,线程跑多个协程,栈KB级别。

线程和协程.PNG

CSP

golang提倡通信共享内存而不是通过共享内存实现通信,所以线程之间的通信通过channel管道来实现的,这点是与我之前学习的语言特性不一样的。

通过通信共享内存.PNG

依赖管理

发展历程:

image.png

Go PATH

Go PATH是最早使用的依赖管理工具,它的主要弊端在于,当A,B俩个项目依赖于package的不同版本的时候,它无法实现package的多版本控制。

Go Vendor

Go Vendor的主要弊端在于:

  • 无法控制依赖的版本。

  • 更新项目又可能出现依赖冲突,导致编译出错。

Go Module

依赖管理的三个要素:

  1. 配置文件,去描述这些依赖,会使用go.mod文件。

  2. 中心仓库管理依赖库,会使用Proxy代理。

  3. 本地工具的使用,go get/mod。

测试

测试是避免事故的最后一道屏障,可见测试对于产品的发布是多么重要。

测试主要分为三个测试模块。

  • 回归测试,覆盖率最低,成本最高。

  • 集成测试,覆盖率中等,成本中等。

  • 单元测试,覆盖率最高,成本也是最低的。

单元测试

主要的流程是这样的:

给定输入,输出,测试单元。测试单元主要包括接口,函数,模块等。并用结果与期望进行校对。

单元测试-规则

  1. 所有的测试文件以_test.go结尾

  2. func TestXXX(*testing.T)

  3. 初始化的逻辑要放在TestMain中

举个栗子:

单元测试的例子.PNG

运行的结果:

结果.PNG

单元测试的条件

  • 稳定性:

稳定性是指相互隔离,能在任何时间,和任何环境下运行测试。就是不受外部依赖的影响

  • 幂等性:

每一次运行都能产生与之前一样的结果

因此我们要使用Mock测试

基准测试

基准测试是测试一段程序的运行性能和耗费CPU的程度。主要用于当程序遇到性能瓶颈问题的时候,为了定位问题所以要做性能测试。

总结

在上完青训营的第二节课后,让我对Go语言有了更加清晰的认识,了解了一些Go语言的高级特性主要是并发,一些依赖包的发展和测试环节的重要性。除此之外,老师也为我们准备了项目实践环节,让我接触到工程中开发的流程,这点是至关重要的,这也是我们在校园学习中很少能接触到的,听完这节课,我受益匪浅。