GO语言工程实践课后作业:实现思路、代码以及路径记录 | 青训营

112 阅读2分钟

课后作业

1.要求

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

2.实现思路

  1. 新增两条路由,用于回帖和查看帖子。
  2. 全局id变量,每次加一,加锁访问√
  3. 这个暂时没有实现

3.具体代码 新增两个路由用来查看和回帖子

//查看帖子路由 最终将结果存储在变量`data`中。最后,它将结果以JSON格式返回给客户端,状态码为200
r.GET("/community/page/get/:id", func(c *gin.Context) {  
topicId := c.Param("id")  
data := handler.QueryPageInfo(topicId)  
c.JSON(200, data)  
})  
//回帖路由。将结果存储在变量`data`中。最后,它将结果以JSON格式返回给客户端,状态码为200
r.POST("/community/post/do", func(c *gin.Context) {  
uid, _ := c.GetPostForm("uid")  
topicId, _ := c.GetPostForm("topic_id")  
content, _ := c.GetPostForm("content")  
data := handler.PublishPost(uid, topicId, content)  
c.JSON(200, data)  
})

使用同步锁防止id重复

func ManyGoWait() {  
var wg sync.WaitGroup  
for i := 0; i < 5; i++ {  
wg.Add(1)  
go func(j int) {  
defer wg.Done()  
hello(j)  
}(i)  
}  
wg.Wait()  
}

对于3.新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题 ,由于时间原因需要再想一想,后续会更新方法


最终代码结构

controller视图层

主要负责处理用户输入的数据,并相应相应数据,包含两个文件

  • publish.go

    用户发布数据的接口,包括发布话题,以及回复

  • query_page_info.go

    用户查看数据的接口,可查看话题和对应的回复

data数据库

存储数据的文件,因为只是一个简单的项目,所以并没有用到数据库,而是使用文件存储json格式的文件,包含两个文件

  • post : 所有回复的信息
  • topic :所有话题的信息

repository 数据层

负责数据库的增删改查,为上层提供了简单易用的接口,包含三个文件

  • db_init.go 从文件中读取出所有的数据,并存储到对应的Map中,便于后续的查找

  • post.go

    • 实现了通过话题id查找对应回复
    • 实现了新增回复
    • 实现了查找id的最大值(用于实现唯一id)
  • topic.go

    • 实现了通过id查找对应话题
    • 实现了新增话题
    • 实现了查找id的最大值(用于实现唯一id)

service

处理业务逻辑,对数据层的数据进行处理,并将结果返回给视图层,只包含一个文件

  • query_page_info.go : 查找话题及相应回复

server.go

  • 程序入口,定义路由,处理路由,调用接口响应请求;