这是我参加第五届青训营伴学笔记创作活动的第三天
在这里实现一个小demo(在这里只实现后端),如下图:
需求背景
需求描述
需求用例
给用户返回topicpage,包含topic主题,和postlist回帖列表
结构体定义
type Topic struct {
Id int64 `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
CreateTime int64 `json:"create_time"`
}
分别对应主题的id,标题,目录以创建时间
type Post struct {
Id int64 `json:"id"`
ParentId int64 `json:"parent_id"`
Content string `json:"content"`
CreateTime int64 `json:"create_time"`
}
Post也有四个字段,分别对应id,parentid对应该回帖所对应的topic,目录以及创建时间
分层结构
整体分为三层,repository数据层,service逻辑层,controller视图层,数据层关联底层数据模型,封装外部数据的增删改查,数据保存在本地data文件中,通过文件操作拉去话题,帖子数据队service层透明,屏蔽下游数据差异,也就不管下游是文件,还是数据库,还是微服务等,对service层的接口模型是不变的。视图层负责处理和外部的交互逻辑,以view试图的形式返回给客户端,在这里,我们封装json格式化的请求结果。
组件工具
- gin:高性能go web开发框架
- go mod
repository
用两个map存储topic和post,读取文件初始化得到两个map,存储所有topic和postlist
上图实现了查询的操作,用到了sync.once主要适用高并发的场景下只执行一次的场景。
service
通过prepareInfo()方法,话题和回帖信息的获取都依赖topicid,所以可以并行执行,题高执行效率。