这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
本节课程主要分为四个方面:
- 并发编程
- 依赖管理
- 单元测试
- 项目实战
并发编程
这里就解释下出现的名词的意思吧
协程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…
需求
- 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口;
- 本地文件存储数据
组件及技术点
-
web框架:Gin - github.com/gin-gonic/g…
- 了解go web框架的简单使用
-
分层结构设计:github.com/bxcodec/go-…
- 了解分层设计的概念
-
文件操作:读文件pkg.go.dev/io
-
数据查询:索引www.baike.com/wikiid/5527…
课后实践
- 支持对话题发布回帖。
- 回帖id生成需要保证不重复、唯一性。
- 新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题 。
1、业务逻辑,直接实现即可。
2、可以使用雪花算法。
3、可以使用 sync.Map 保证并发安全。