这是我参与「第五届青训营」伴学笔记创作活动的第 11 天
Go语言工程项目实践
大家应该都是从掘金的社区话题入口报名的,页面的功能包括话题详情,回帖列表,支持回帖,点赞和回帖回复,我们今天就以此为需求模型,开发一个该页面涉及的服务端小功能。
需求描述
社区话题页面
- 展示话题(标题,文字描述)和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储,不涉及数据库
需求用例
游览消费用户
ER图——Entity Relationship Diagram
两个实体
- 话题
- 帖子
- 关系是一对多(一话题——多帖子)
分层结构
- 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图view,处理和外部的交互逻辑
组件工具
- Gin高性能go web框架
- Go Mod
- go mod init
- go get gopkg.in/gin-gonic/gin.v1@v1.3.0
- 执行后会在go.mod中出现gin的依赖
Respository
首先是respository(资料档案库),我们可以根据之前的ER图定义struct。
Topic
{
"id":1,
"title":"青训营来啦!"
"content":"小姐姐,快到碗里来~",
"create_time":1650437625
}
Post
{
"id":1,
"parent_id":1,
"content":"小姐姐快来1",
"create_time":1650437616
}
Respository-index
var (
topicIndexMap map[int64]*Topic
postIndexMap map[int64] []*Post
)
一方面查询我们可以用全扫描遍历的方式,但是这虽然能达到我们的目的,但是并非高效的方式,所以这里引出索引的概念,索引就像书的目录,可以引导我们快速查找定位我们需要的结果;这里我们用map实现内存索引,在服务对外暴露前,利用文件元数据初始化全局内存索引,实现O(1)的时间复杂度查找操作。
课后实践
- 支持发布帖子
- 本地Id生成需要保证不重复、唯一性
- Append文件,更新索引,主义Map的并发安全问题