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

55 阅读2分钟

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

一、本堂课内容

  • 锁Lock
  • 线程同步 WaitGroup
  • Go Module
  • 单元测试概念和规则
  • Mock测试
  • 基准测试
  • 项目实战

二、详细知识点

1. goroutine

在Go里,每一个并发执行的活动称为goroutine,是一种用户态线程,也称为协程,其创建和切换无需进入操作系统内核,栈一般为KB大小。

f()
go f() // 新建一个调用f()的goroutine

2. channel

通道是可以让一个goroutine发送特定值到另一个goroutine的通信机制,提倡通过通信共享内存而不是通过共享内存而实现通信。

可以使用make函数来创建一个通道,make(chan 元素类型,[缓冲大小]):

ch := make(chan int) // 无缓冲通道
ch := make(cham int, 2) // 有缓冲通道

通道有发送和接收两个主要操作,用<-操作符书写。

ch <- x // 发送
x = <- ch // 接收

关闭通道

close(ch)

3.lock

互斥锁sync.Mutex

声明

var mu sync.Mutex

加锁

mu.Lock()

解锁

mu.Unlock()

4.WaitGroup

WaitGroup对象内部有一个计数器,有Add(n), Done()来控制计数器数量,Wait()会阻塞代码运行直到计数器值减到0

5.Go Module

  • 通过 go.mod 文件管理依赖包版本
  • 通过 go get/go mod 指令工具管理依赖包

依赖管理三要素:

  1. 配置文件,描述依赖 go.mod
  2. 中心仓库管理依赖库 Proxy
  3. 本地工具 go get/mod

6.单元测试

  • 所有测试文件以_test.go结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责

7.基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力

三、实践练习例子

实现社区话题页面

  • 展示话题和回帖列表
  • 实现本地web服务
  • 话题和回帖数据用文件存储