Go语言工程项目实践 | 青训营笔记

78 阅读2分钟

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

Go语言工程项目实践

大家应该都是从掘金的社区话题入口报名的,页面的功能包括话题详情,回帖列表,支持回帖,点赞和回帖回复,我们今天就以此为需求模型,开发一个该页面涉及的服务端小功能。

需求描述

社区话题页面

  • 展示话题(标题,文字描述)和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储,不涉及数据库

需求用例

游览消费用户

消费用户.png

ER图——Entity Relationship Diagram

两个实体

  • 话题
  • 帖子
  • 关系是一对多(一话题——多帖子) 话题帖子.png

分层结构

  • 数据层:数据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

索引.png

var (
    topicIndexMap map[int64]*Topic
    postIndexMap map[int64] []*Post
)

一方面查询我们可以用全扫描遍历的方式,但是这虽然能达到我们的目的,但是并非高效的方式,所以这里引出索引的概念,索引就像书的目录,可以引导我们快速查找定位我们需要的结果;这里我们用map实现内存索引,在服务对外暴露前,利用文件元数据初始化全局内存索引,实现O(1)的时间复杂度查找操作。

课后实践

  • 支持发布帖子
  • 本地Id生成需要保证不重复、唯一性
  • Append文件,更新索引,主义Map的并发安全问题