Go 语言进阶 - 工程进阶 | 青训营笔记

138 阅读4分钟

这是我参与「第五届青训营」伴学笔记创作活动的第2天

一、本堂课重点内容

  • 本节课程主要分为四个方面:
  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战

二、详细知识点介绍

Goroutine

Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。

我们通过go让其中一个函数同步运行,如此就不需要等待该函数运行完后才能运行下一个函数。

func main() {
    // 通过go,我们可以把这个函数异步执行,这样就不会阻塞往下执行。
    go loop()
    // 执行 Other
}

Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数能够限制Gorotuine可以占用几个系统线程来避免失控。

WaitGroup

使用方法是:

image.png

  • wg.Add():main协程通过调用 wg.Add(delta int) 设置worker协程的个数,然后创建worker协程;
  • wg.Done():worker协程执行结束以后,都要调用 wg.Done(),表示做完任务,goroutine减1;
  • wg.Wait() :main协程调用 wg.Wait() 且被block,直到所有worker协程全部执行结束后返回。
  • 针对可能panic的goroutine,可以使用defer wg.Done()来结束goroutine。

Channel

如果说goroutine是go语言程序的并发体的话,那么channel则是他们之间通信机制。一个channel是一个通信机制,他可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可以发送数据类型。一个可以发送int类型数据的channel一般写为 chan int。
使用内置函数 make,来创建 channel

ch := make(chan int)

和map类似,channel也对应一个make创建的底层数据结构的引用。当我们复制一个channel或用于函数参数传递时,我们只是拷贝一个channel引用,因此调用者和被调用者都引用同一个channel。和其他的引用类型一样,channel的零值也是nil

ch<-x
x = <-ch
<-ch
close(ch)
ch = make(chan int,3)
不带缓存的 channels

一个基于无缓存channels的发送操作将导致发送者goroutine阻塞。直到另一个goroutine在相同的channel上继续执行操作接收,当发送的值通过channels成功传输之后,两个goroutine可以继续执行后面的语句、反之,如果接收操作发生,那么接收者goroutine也将阻塞,知道有另一个goroutine在相同的channels上执行发送操作。

带缓存的 channels

channel 可以是带缓冲的,创建 channel 时可以指定缓冲的消息数量,当消息数量小于指定值时,不会出现阻塞,超过之后才会阻塞。为 make 提供第二个参数作为缓冲大小来初始化一个缓冲 channel:

ch := make(chan int, 100)

向缓冲 channel 发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区为空的时候接收会阻塞。

Go Module

go.mod 的内容比较容易理解

  • 第一行:模块的引用路径
  • 第二行:项目使用的 go 版本
  • 第三行:项目所需的直接依赖包及其版本
module github.com/BingmingWong/module-test

go 1.14

require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pear // indirect
    example.com/strawberry // incompatible
)

版本选择算法 Minimal Version Selection(MVS)

那么什么是最小版本选择原理呢?

Go 最小版本选择指的是,在选择依赖的版本时,优先选择项目中最合适的最低版本。当然,并不是说 MVS 不能选择最新的版本,而是说如果项目中任何依赖都用不到最新的版本,那么我们本质上不需要它。

三、实践练习例子——社区话题页面

  1. 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口;
  2. 本地文件存储数据

组件及技术点

四、引用参考: