这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、第二节课重点内容:
- Go语言进阶——从并发角度看Go
- 依赖管理
- 常用测试
- 实战项目(难度陡起)
二、详细内容:
-
goroutine
由并发与并行引入,分析go在这方面的优势,学过操作系统的都知道,Linux系统分为用户态和内核态,使用多线程或者多进程可以实现高并发,然而多线程占据内核态并且栈空间需要MB级别,更何况进程,所以Go语言中的实现了轻量级线程——协程,只需要KB级别的栈空间,可以轻松支持上万并发。goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。 开发人员实现也很方便,使用go + 函数或者匿名函数即可。
func test() {
var i int
for {
fmt.Println(i)
time.Sleep(time.Second)
i++
}
}
func main() {
go test()
}
-
channel
go提供了channel这个概念,顾名思义,作为信道,来处理goroutine之间的通信。在实现上,就是声明一个chan type,来存放要接收或发送的数据。它不仅允许你将一个值从一个goroutine发送给另一个goroutine并且保证了在接收该值的goroutine使用这个值之前,它一定是被发送过来的。课程中使用了一个生产者和消费者例子介绍。 channel的类型分为 有缓存channel和无缓存channel,有缓存channel类似于一个阻塞队列。
-
并发Lock
互斥锁(sync.Mutex),多个线程操作同一把锁,实现多线程之间的管理,保证线程安全。go的互斥锁不支持重入,也不支持重复unlock。
- 一个已经锁住的互斥锁不能再次被锁住,不管是同一个还是另一个goroutine
- 一个已经释放的互斥锁也不能再次被释放,不管是同一个还是另一个goroutine
-
go实现并发任务同步
Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法:
sync.WaitGroup内部维护着一个计数器,计数器的值可以增加和减少。例如当我们启动了 N 个并发任务时,就将计数器值增加N。每个任务完成时通过调用 Done 方法将计数器减1。通过调用 Wait 来等待并发任务执行完,当计数器值为 0 时,表示所有并发任务已经完成。
-
依赖管理
依赖管理的进化就不说了现在基本由GOPATH都改为Go Module
-
工程上的测试
- 单元测试[概念]和[规则]
- Mock测试
- 基准测试
-
项目实战 - 组件及技术点
基于web框架——Gin的社区话题页面,使用分层结构设计(MEV),既数据层,逻辑层,视图层(低耦合的特点吧),涉及到文件操作——读文件、数据查询——索引等相关知识(慢慢看吧,哭哭)。