DAY2
GO语言进阶与依赖管理
1.并发编程
并发:多线程程序在一个核的cpu上运行,通过时间片切换实现同时运行的状态
并行:利用多核实现多线程的同时在cpu上运行
GO实现了高性能并发调度模型, 充分发挥多核优势.
线程与协程:线程内核态,是系统的资源,栈MB级别。而协程是用户态,轻量级线程,栈KB级别,一个线程跑多个协程。
协程是GO独有,这是go适合高并发应用场景的原因。
tips:
1.print和println 在golang中 是属于输出到标准错误流中并打印.
2.fmt.Print,fmt.Println属于官方包fmt中自带的打印方法,在golang中 是属于标准输出流,一般使用它来进行屏幕输出
**快速打印**,创建协程运行:
```go
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)//末尾括号表示匿名函数被直接调用,有参数传入将参数写在括号里
}
}
tips:print,Sprint,printf的区别.
GO提倡通过通信channel共享内存(多个协程访问同一个内存空间),而不是通过共享内存而实现通信.
可以通过make(chan 元素类型,[缓冲大小])来创建通道
并发安全Lock:
加锁与否,决定并发是否安全,对临界区的控制。
WaitGroup:实现并发任务的同步。
(内部维护了一个计数器,开启协程+1,执行结束-1,计数为0时主协程阻塞结束)
func ManyGoWait() {
var wg sync.WaitGroup
wg.Add(5)//添加5个协程
for i := 0; i < 5; i++ {
go func(j int) {
defer wg.Done()//defer进队列,wg.Done 计数器-1代表协程执行结束
hello(j)
}(i)
}
wg.Wait()//主协程阻塞,在上面5个字协程执行完前不会往下进行
}
2.依赖管理
依赖像java中一样,是前人研发好的包来进行依赖导入,实现各种功能,调用轮子。
(1)GOPATH是go语言的环境变量:项目直接依赖于src下的代码,通过go get下载,无法实现多版本控制.
(2)Go Vendor
项目增加Vandor文件夹,存放依赖包副本,依赖优先从这里获取,没有再去GOPATH,通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题,无法控制依赖的版本
(3)Go Module
通过go.mod 文件管理依赖包版本
通过go get/go mod 指令工具管理依赖包
依赖管理的三要素:配置文件go.mod/中心仓库管理依赖库Proxy/本地工具go get/mod,类比Maven
go mod init 初始化,创建go.mod文件
go mod download 下载模块到本地缓存
go mod tidy 增加需要的依赖,删除不需要的依赖//每次运行之前执行一次
测试
测试是开发中的重中之重,尤其是企业开发,关系到安全。
(1)回归测试-->回归应用场景
(2)集成测试->对于功能进行测试
(3)单元测试->开发者对于单个模块进行测试
成本降低,覆盖率减小
单元测试
规则:
1.测试文件以_test.go结尾
2.func TestXxx(*testing.T)测试函数编写
3.初始化逻辑放在TestMain中
代码覆盖率:
即为测试的覆盖度,可以简单的理解为运行过程中跑过的代码占全部代码的百分百
测试分支独立,单元粒度足够小,函数单一职责
幂等:重复运行一个测试,结果一样
稳定:单元测试能够相互隔离,独立运行
Mock测试
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
函数/方法打桩:用函数a替换函数b,取消对于测试文件的依赖,保证单元测试稳定性
基准测试
基准测试(benchmarking)是一种测量和评估软件性能指标的活动。
func BenchmarkXxxx(b *testing.B)
可用字节开源的fastrand提高性能,优化基准测试
项目实践
1.需求描述:社区话题单页面,展示话题,回帖列表
2.需求用例分析:ER图,结构体设计,类似于数据库设计?
3.分层模型:常规开发分层
数据层,逻辑层,视图层
外部数据增删改查Model
处理核心业务逻辑输出Entity
视图View处理和外部的交互逻辑
4.组件工具
Gin:高性能的go web框架
Go Mod
!map索引方式存储数据行,性能高,速度快
无交叉操作可以并行处理提高效率。
今日课程总结
第二天的学习主要是go语言中并发编程,依赖相关和测试的内容。
并发编程中引入了go中特有的协程概念,一个线程可分为多个协程,协程直接还可以通过通道channel进行内存的共享,其中需要注意数据同步的问题,可以用lock,但最好还是用sync.WaitGroup()来进行实现,它的本质是维护了一个管理协程的计数器。
依赖管理中介绍了三种依赖管理的方法,其中Go Module是现在主流的使用工具,通过相关命令来对依赖进行管理。
测试中讲述了3中测试方法,很好地复习了我对于测试概念的了解,单元测试,Mock测试,基准测试各自有不同的应用场景.
而项目实践中对业务进行了简单的开发流程介绍,需要用到gin框架来进行web的后端开发,类似于Java中的Spring框架。
思考:
总之对于GO语言的基础语法,还需要加深学习,其中匿名函数的语法规则,标准库不同的近似方法也模糊不清,需要加强。