课后作业社区评论页的简单实现是第一次接触GoWeb的项目。接触到了新的框架Gogin来实现goweb的开发。整体架构类似MVC框架,有repository层管理数据,Service层管理服务,Controller层来调用不同的服务,最后gogin来管理路由于controller的匹配关系。
Repository
我们的需求是对于一个社区评论页面,要展示页面的话题(topic)以及改话题的评论列表(post)。所以我们暂且需要两个存储结构来存储topic以及post,且topic与post是一对多的关系。通过post的parent_id来指向其所属的topic。
数据库初始化
由于我们暂时不引入mysql来存储数据,我们暂且将数据存放在本地。该方法通过定义两个map来存储topic和post。key值分别为topic.Id和post.Id,通过各自的Id就可以获取到相对应的topic和post。
相对于两个map来存储数据,我们定义了两个初始化的函数在整个页面运行起来时就先把map里有的数据先加载进来。
数据存取
对于topic的数据,我们定义了通过Id来检索topic的数据操作函数。
对于post的数据,我们定义了通过Id来检索特定post,通过parent_Id来检索特定topic所包含的post以及添加post的操作。
对于数据的存取操作实现起来还是比较清晰明了的,以map数据结构存储为数据库,定义好了键值就可以很快速的找到想要找的value值了。
Post发表
Post发表这个函数定义在了service层。我们定义了一个PublishPostFlow的结构体来存放需要发表post的信息,然后定义一个结构体函数publish()来调用post repository上的CreatePost()函数来完成发表。
完成service层的post发表函数之后,我们在controller层来调用这个服务。controller层收集用户请求的信息,包括要发表在的topicId,发表的标题以及发表的内容。将这些信息作为参数来调用服务层的PublishPost()服务来实现post发表的功能。
由于考虑到会有多个用户在同一时间在同一topic上发表post的可能,我选择用go的waitgroup套住controller层调用PublishPost()服务这一并发操作上,每次允许一个线程运行保证postId不会重复。
总结
社区评论页是很好的实践项目对于初入门go语言的学者。可以很好的了解到项目的架构以及各种数据,服务的定义和运行。熟悉了解了goweb开发的三层结构以及gogin框架。对于之后的更复杂的goweb开发打下了很好的基础。