这是我参与【第五届青训营】伴学笔记创作活动的第一天。这节课主要学的是并发编程、依赖管理和单元测试相关知识。课上还讲解了一个项目实践,主要说了业务流程和思路。
首先是并发编程。Go语言的并发编程和并行是两个概念。并行是多线程程序在一个核上的CPU运行;并发是 多线程程序在多个核上的CPU运行。Go可以充分发挥多核优势,高效运行。GO比其他语言多了协程的概念。协程是轻量级线程,栈是Kb级的,一个线程可以拥有多个协程。线程是内核态,协程是用户态。当一个程序启动时,其主函数即在一个单独的协程中运行,我们叫它主协程。创建新的协程只需要在函数或方法调用前添加关键字go。go f()创建一个运行f函数的新协程。协程间的通信既可以通过通道共享内存,也可以通过共享内存实现通信。
Go的依赖管理从GOPATH到Go Vendor再到现在的Go Module不断演进。GOPATH无法实现包的多版本控制,项目只能使用一个库的单个版本。Go Vendor不能标示依赖的版本,无法控制依赖的版本,可能导致依赖冲突。Go Module通过go.mod文件管理依赖包版本和通过go get/go mod指令工具管理依赖包。Go Module依赖管理三要素:1通过go.mod配置文件,管理依赖。2通过Proxy中心仓库管理依赖库。3通过go get/go mod本地工具操作依赖。
测试主要是单元测试、Mock测试和基准测试。单元测试所有测试文件以_test.go结尾。单元测试函数为func TestXxx(*testing.T)。初始化逻辑放到TestMain中。单元测试的评价标准是代码覆盖率。代码覆盖率是测试中运行的代码量除以程序全部的代码量。单元测试的代码覆盖率一般为0.5到0.6。单元测试中测试分支要相互对立,全面覆盖。测试单元粒度要足够小,函数单一职责。对于单元测试中的依赖要满足幂等性和稳定性。稳定是指相互隔离,能在任何时间任何环境运行运行测试。幂等是指每一次测试运行都能产生与以前一样的结果。幂等性要借助Mock测试。基准测试是为了优化代码。