这是我参与「第五届青训营 」伴学笔记创作活动的第2天。
一、本堂课重点内容
主要学习了并发编程,依赖管理以及项目测试的相关知识,了解了协程,通道,go依赖管理演进,依赖管理方案等知识。
二、详细知识点介绍
并发编程
并发VS并行:并发,是指多线程程序在一个核的CPU上运行;而并发,指的是多线程程序在多个核的CPU上运行。Go语言通过调度,可以充分发挥多核优势,高效运行,可以说,Go 语言就是为了并发而生的。
协程和线程:线程属于内核态,它的创建,切换等操作都属于系统操作。而协程属于用户态,相当于轻量级的线程通常情况下,一个线程会跑多个协程。
Go 语言中开启协程的方式比较简单,只需要在调用的方法前面加上关键字go,即被视为协程调用。例如:
for i:=0;i < 5;i++{
go func(j int){
hello(j)
}(i)
}
channel:通道,创建方式:(chan 元素类型,[缓冲大小])。通道类型分为无缓冲通道和有缓冲通道,如make(chan int)和make(chan int,2)。无缓冲通道会使两个协程的消息传递同步化,所以又被称为同步通道,而有缓冲通道中有缓冲区,可以存放一定的信息,存放信息的多少由缓冲容量决定。
lock:通过在作为协程的函数代码块中使用lock()加锁,可以保证协程运行的安全。
waitgroup:用于控制协程的安全。add(n int)计数器+n;done()计算器-1;wait()阻塞直到计数器为0。
依赖管理
在开发过程中,工程项目不可能基于标准库一步一步的取编码实现,这时,我们就需要使用依赖库以达到简化开发的目的。
Go 语言的依赖管理的发展:GOPATH->Go Vendor->Go Module。不同的项目环境依赖的版本不同。
GOPATH:是Go 语言支持的一个环境变量。在这个变量下主要有三个文件:bin,项目编译的二进制文件;pkg,项目编译的中间产物,加速编译;src,项目源码,项目代码直接依赖src中的代码,使用go get可以下载最新版本的包到src目录下。
存在的弊端:无法实现package的多版本控制。
Go Vendor:在项目目录下增加vendor文件,所有依赖包副本形式放在其中。通过每个项目引入一份依赖的副本,解决多个项目需要同一个package依赖的冲突问题。
弊端:无法控制依赖的版本,更新项目可能出现依赖冲突。
Go Module:通过go.mod文件管理依赖包版本。通过go get/go mod指令工具管理依赖包。
工具go get下载对应版本的依赖包(默认为最新版)。go mod,init初始化,创建go.mod文件;download下载模块到本地缓存,tidy,增加需要的依赖,删除不需要的依赖。
测试
软件工程项目的开发过程中,难免会有事故发生,而测试则是避免事故的最后一道屏障。主要分为三种类型:回归测试,集成测试,单元测试。测试覆盖率逐层增大,成本逐层降低。
单元测试,通过输入测试数据到测试单元中得到对应的输出,并与期望值进行校对,从而发现和改善函数或模块,保证质量和提高效率。
规则:
1.所有测试文件以_test.go结尾;
2.func TestXxx (* testing.T);
3.初始化逻辑放到TestMain中。
如何评估测试的水平:代码覆盖率。即测试运行的代码占总代码的比例。
三、实践练习例子
社区话题页面
首先,构建用例图;
设计实体联系图,分析需要构建的类和对应的属性;
分层,数据层:封装外部数据的增删改查;逻辑层,处理核心业务逻辑输出;视图层,处理和外部的交互逻辑;
go mod init创建go.mod文件;
使用map初始化topic的索引;
实现根据ID查询topic的操作;
分别构建数据层,逻辑层,视图层程序;
创建路由,启动程序;
运行测试。
四、课后个人总结
经过本堂课的学习,我对并发编程,依赖管理以及项目测试的相关知识有了一定的了解,对于课程中的项目实战,自己编写代码还存在很大的困难,需要以后多加实践联系。