go语言进阶|青训营

129 阅读5分钟

这是我参与「第六届青训营 」笔记创作活动的第二天,

1.语言进阶

1.1 并发编程

单核编程,多线程程序再一个核的cpu上运行,go语言可以充分发挥多核优势,高效运行。
协程有用户态并且是轻量级线程,栈是MB级别。线程是内核态,线程可以跑多个协程。

1.2 CSP

`CSP` 是 `Communicating Sequential Process` 的简称,中文可以叫做`通信顺序进程`,是一种并发编程模型,由Tony Hoare于1977年提出。
简单来说,CSP模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。
CSP 模型的关键是关注 channel,而不关注发送消息的实体。

1.3 Channle

无缓冲通道:无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。
有缓冲通道:是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。

1.4 并发安全Lock

在默认情况下,互斥锁的所有状态位都是 0,`int32` 中的不同位分别表示了不同的状态:1位表示是否被锁定,1位表示是否有协程已经被唤醒,1位表示是否处于饥饿状态,剩下29位表示阻塞的协程数。
正常模式:所有goroutine按照FIFO的顺序进行锁获取,被唤醒的goroutine和新请求锁的goroutine同时进行锁获取,通常新请求锁的goroutine更容易获取锁(持续占有cpu),被唤醒的goroutine则不容易获取到锁。
饥饿模式:所有尝试获取锁的goroutine进行等待排队,新请求锁的goroutine不会进行锁获取(禁用自旋),而是加入队列尾部等待获取锁。

1.5 waitGroup

`sync.WaitGroup`可以等待一组 Goroutine 的返回
`sync.WaitGroup` 对外暴露了三个方法:方法名为(wg * WaitGroup) Add(delta int) 功能主要是计数器+delta,方法名为(wg *WaitGroup) Done() 功能是计数器减1,方法名为(wg *WaitGroup) Wait() 功能是阻塞直到计数器变为0

2.依赖管理

2.1 go依赖管理的演进

从Gopath到Go Vendor再到go Module,不同环境依赖的版本不同,控制依赖库版本也有所不同,Gopath中bin是项目编译的二进制文件,pkg是项目编译的中间产物,加速编译,src是项目的源码。
Gopath的弊端是无法实现package的多版本控制,Go Vendor中通过每一个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。无法控制依赖的版本,而且更新项目又可能出现依赖冲突,导致编译出错。

2.2依赖管理三要素

Go.mod是配置文件,Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
Go.mod其实就是一个Modules,关于Modules的官方定义为:Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。
描述依赖,Proxy中心仓库管理依赖库,Go Module 通过 GOPROXY 环境变量控制如何使用 Go Proxy.GOPROXY是一个 Go Proxy 站点 URL 列表。还有go get/mod 本地工具。

3.测试

3.1 单元测试

 单元测试主要包括了,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符。
 单元测试的覆盖率,一般的覆盖率为50%左右,较高的覆盖率为80%左右,测试分支相互独立,全面覆盖,我们要求函数体足够小,这样就比较简单的提升覆盖率,也符合函数设计的单一职责。

3.2 单元测试—依赖

 我们的单元测试需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。幂等是指每一次测试运行都应该产生与之前一样的结果,而要实现这一目的要用到mock机制。

3.3 单元测试—文件处理

为确保测试case的稳定性,我们对读取文件函数进行mock,屏蔽对于文件的依赖。

4.总结

通过本次课程的学习了解到了go语言的依赖特性,知道了依赖管理的演进过程同时也了解了依赖管理的三要素,并且还知道了CSP的特性以及并发编程的原理以及特点,通过今天学习的项目实例,知道了er图的设计以及分层结构的重要性。