Go 语言进阶 - 工程进阶 课程笔记与资料总结| 青训营笔记

301 阅读3分钟

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

本节课程主要分为四个方面:

  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战

并发编程

这里就解释下出现的名词的意思吧

协程Goroutine

Goroutine 是 Go 语言实现的协程,属于内核态,可以理解为轻量级,操作系统无感知,栈MB级别。

Go 语言可以创建上万的协程。

通道Channel

Go 语言推荐通过通信来共享内存,Channel 就是通信的方式。

Channel 本质是一个先进先出的队列,且线程安全,无需加锁。

锁Lock

Go 语言的通过共享内存来实现多线程的方式。

实际上就是一个标记临界区是否可用的标志变量。

线程同步WaitGroup

WaitGroup 是通过计数器的方式来实现主协程阻塞的结构体。

对外暴露三个方法

 Add(delta int) // 计数器+delta
 Done() //计数器-1
 Wait() // 阻塞协程直到计数器为0

依赖管理

Gopath

通过环境变量 GOPATH 来实现。

项目代码直接依赖 src 下的代码,使用 go get 下载最新版本的包到 src 目录。

Go Vendor

过渡方案。

项目目录下增加 vendor 文件,所有依赖包以副本的形式放在 $ProjectRoot/vender

依赖的寻址方式为 vendor => GOPATH。

通过引入依赖副本来解决多个项目需要同一个 package 依赖的冲突问题。

Go Module

目前推荐使用的依赖管理模式,终极目标是定义版本规则和管理项目依赖关系。

通过go.mod文件管理依赖包版本。

通过goget/gomod指令工具管理依赖包。

依赖管理的三个要素

1、配置文件,描述依赖 go.mod

2、中心仓库管理依赖库 Proxy

3、本地工具 go get/mod

终于可以不用在 GOPATH 下写代码了

单元测试

单元测试概念和规则

所有的测试文件都以 _test.go 结尾。

测试函数名为 Test + 原函数名。

初始化的逻辑可以放在 TestMain() 函数中。

Mock测试

可以使用 monkey 包来对函数进行打桩,返回 mock 数据,让测试的逻辑可以不依赖于本地文件。

基准测试

和单元测试类似,基准测试函数以 Benchmark 开头。

测试的案例中,由于 rand 包持有了全局锁,故可以使用 fastrand 包来进行优化。

项目实战

需求模型来源

青训营话题页forum.juejin.cn/youthcamp/p…

需求

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

组件及技术点

课后实践

  1. 支持对话题发布回帖。
  2. 回帖id生成需要保证不重复、唯一性。
  3. 新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题

1、业务逻辑,直接实现即可。

2、可以使用雪花算法。

3、可以使用 sync.Map 保证并发安全。