青训营笔记

199 阅读2分钟

“这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
今天的课程主要分为四个方面:

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

一、 并发编程

  1. 协程Goroutine
  2. 通道Channel
  3. 锁Lock
  4. 线程同步WaitGroup

二、 依赖管理

  1. Gopath
  2. GoVendor
  3. GoModule

三、 单元测试

  1. 单元测试概念和规则
  2. Mock测试
  3. 基准测试

四、 项目实战

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

并发编程和依赖管理部分的内容都比较基础,我也认为老师已经讲的十分明了了,这里我就不再赘述单元测试部分老师也讲的挺好的,补充知识的话可以在go语言圣经的第十一章测试中补全(测试 - Go语言圣经 (gopl-zh.github.io))

今天的实践是

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

首先是repository层,repository层是资源层和数据库进行对接,所以我们仅需要定义出topic和post必须的元素的结构体即可

type Topic struct {
   Id         int64  `json:"id"`
   Title      string `json:"title"`
   Content    string `json:"content"`
   CreateTime int64  `json:"create_time"`
}
type Post struct {
   Id         int64  `json:"id"`
   TopicId    string `json:"topicid"`
   Content    string `json:"content"`
   CreateTime int64  `json:"create_time"`
}

然后我们实现controller层,controller层是监听器层,与视图层对接,这里由于篇幅问题我就只放一个发布回帖部分的代码了

image.png

最后我们需要实现service层,service层是业务层负责实现业务逻辑
我们第一个要解决的是id互不相同的问题,这里的简单实现是用时间戳生成,可以使用官方的time包实现time.now().unix,这里我使用了第三方库

image.png 最后要解决的问题是如何对话题和回帖进行索引,我们可以使用简单的map实现,首先定义全局索引map

image.png

最后需要解决的就是新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题

image.png