这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
在第二节课中,老师重点为我们介绍了四个部分的内容。第一部分,老师从并发的角度讲述了Go语言高性能的本质。第二部分,老师介绍了Go语言依赖管理的演进路线。第三部分,老师主要讲述了测试方面的知识。最后是一个项目实战的内容。
Go语言并发
串性,并行和并发
串行:按序执行程序,比如我们读书的过程,就是一个串行的过程。
并行:同一时刻执行多个任务,比如多线程程序在多个核CPU上运行,并行是几个任务在同一时刻互不干扰的同时执行。
并发:同一时间段执行多个任务,比如多线程程序在一个核的CPU上运行,任务彼此穿插着进行。并发允许事务之间的彼此干扰,并不要求在同一时刻执行。
Goroutine
Go中有进程,线程和协程的概念。
进程:程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
线程:操作系统基于进程开启的轻量级进程,是操作系统调度执行的最小单位。内核态,轻量级线程,栈MB级别。
协程:用户态,线程跑多个协程,栈KB级别。
CSP
golang提倡通信共享内存而不是通过共享内存实现通信,所以线程之间的通信通过channel管道来实现的,这点是与我之前学习的语言特性不一样的。
依赖管理
发展历程:
Go PATH
Go PATH是最早使用的依赖管理工具,它的主要弊端在于,当A,B俩个项目依赖于package的不同版本的时候,它无法实现package的多版本控制。
Go Vendor
Go Vendor的主要弊端在于:
-
无法控制依赖的版本。
-
更新项目又可能出现依赖冲突,导致编译出错。
Go Module
依赖管理的三个要素:
-
配置文件,去描述这些依赖,会使用go.mod文件。
-
中心仓库管理依赖库,会使用Proxy代理。
-
本地工具的使用,go get/mod。
测试
测试是避免事故的最后一道屏障,可见测试对于产品的发布是多么重要。
测试主要分为三个测试模块。
回归测试,覆盖率最低,成本最高。
集成测试,覆盖率中等,成本中等。
单元测试,覆盖率最高,成本也是最低的。
单元测试
主要的流程是这样的:
给定输入,输出,测试单元。测试单元主要包括接口,函数,模块等。并用结果与期望进行校对。
单元测试-规则
所有的测试文件以_test.go结尾
func TestXXX(*testing.T)
初始化的逻辑要放在TestMain中
举个栗子:
运行的结果:
单元测试的条件:
- 稳定性:
稳定性是指相互隔离,能在任何时间,和任何环境下运行测试。就是不受外部依赖的影响。
- 幂等性:
每一次运行都能产生与之前一样的结果。
因此我们要使用Mock测试
基准测试
基准测试是测试一段程序的运行性能和耗费CPU的程度。主要用于当程序遇到性能瓶颈问题的时候,为了定位问题所以要做性能测试。
总结
在上完青训营的第二节课后,让我对Go语言有了更加清晰的认识,了解了一些Go语言的高级特性主要是并发,一些依赖包的发展和测试环节的重要性。除此之外,老师也为我们准备了项目实践环节,让我接触到工程中开发的流程,这点是至关重要的,这也是我们在校园学习中很少能接触到的,听完这节课,我受益匪浅。