Go语言入门-工程实践社区评论页 | 青训营

58 阅读2分钟

课后作业社区评论页的简单实现是第一次接触GoWeb的项目。接触到了新的框架Gogin来实现goweb的开发。整体架构类似MVC框架,有repository层管理数据,Service层管理服务,Controller层来调用不同的服务,最后gogin来管理路由于controller的匹配关系。

Repository

我们的需求是对于一个社区评论页面,要展示页面的话题(topic)以及改话题的评论列表(post)。所以我们暂且需要两个存储结构来存储topic以及post,且topic与post是一对多的关系。通过post的parent_id来指向其所属的topic。

1690947814099.png

1690947876491.png

数据库初始化

由于我们暂时不引入mysql来存储数据,我们暂且将数据存放在本地。该方法通过定义两个map来存储topic和post。key值分别为topic.Id和post.Id,通过各自的Id就可以获取到相对应的topic和post。

1690948317378.png

相对于两个map来存储数据,我们定义了两个初始化的函数在整个页面运行起来时就先把map里有的数据先加载进来。

1690948498423.png

1690948510959.png

数据存取

对于topic的数据,我们定义了通过Id来检索topic的数据操作函数。

1690949110668.png

对于post的数据,我们定义了通过Id来检索特定post,通过parent_Id来检索特定topic所包含的post以及添加post的操作。

1690949192113.png

对于数据的存取操作实现起来还是比较清晰明了的,以map数据结构存储为数据库,定义好了键值就可以很快速的找到想要找的value值了。

Post发表

Post发表这个函数定义在了service层。我们定义了一个PublishPostFlow的结构体来存放需要发表post的信息,然后定义一个结构体函数publish()来调用post repository上的CreatePost()函数来完成发表。

1690954734709.png

完成service层的post发表函数之后,我们在controller层来调用这个服务。controller层收集用户请求的信息,包括要发表在的topicId,发表的标题以及发表的内容。将这些信息作为参数来调用服务层的PublishPost()服务来实现post发表的功能。

由于考虑到会有多个用户在同一时间在同一topic上发表post的可能,我选择用go的waitgroup套住controller层调用PublishPost()服务这一并发操作上,每次允许一个线程运行保证postId不会重复。

1690955157202.png

总结

社区评论页是很好的实践项目对于初入门go语言的学者。可以很好的了解到项目的架构以及各种数据,服务的定义和运行。熟悉了解了goweb开发的三层结构以及gogin框架。对于之后的更复杂的goweb开发打下了很好的基础。