后端与 Go语言进阶与工程实践 | 青训营笔记

78 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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。

  1. 一个已经锁住的互斥锁不能再次被锁住,不管是同一个还是另一个goroutine
  2. 一个已经释放的互斥锁也不能再次被释放,不管是同一个还是另一个goroutine
  • go实现并发任务同步

    Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法:

sync.WaitGroup内部维护着一个计数器,计数器的值可以增加和减少。例如当我们启动了 N 个并发任务时,就将计数器值增加N。每个任务完成时通过调用 Done 方法将计数器减1。通过调用 Wait 来等待并发任务执行完,当计数器值为 0 时,表示所有并发任务已经完成。

  • 依赖管理

    依赖管理的进化就不说了现在基本由GOPATH都改为Go Module

  • 工程上的测试

  1. 单元测试[概念]和[规则]
  2. Mock测试
  3. 基准测试
  • 项目实战 - 组件及技术点

    基于web框架——Gin的社区话题页面,使用分层结构设计(MEV),既数据层,逻辑层,视图层(低耦合的特点吧),涉及到文件操作——读文件、数据查询——索引等相关知识(慢慢看吧,哭哭)。