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

96 阅读3分钟

前言

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范

gin 框架中采用的路由库是基于httprouter做的,gin支持Restful风格的API即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化",是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作,可以通过Context的Param方法获取API参数。

    r := gin.Default()
    r.GET("/", func(context *gin.Context) {
        context.String(http.StatusOK, "Hello")
    })
    r.POST("/xxxpost",func())
    r.PUT("/xxxput",func())

    r.Run(":8080")
}

一 需求描述

我们需要实现一个社区话题页面包含展示话题(标题,文字描述)和回帖列表,需要实现涉及服务端交互的两个功能———查看话题和回帖。

二 需求用例

image.png

image.png E-R国是典型的分层结构设计模型。思考需求不难发现每一个topic对应着多个post,post中存有topicid来表示这个post属于哪个topic。有了模型实体,属性以及之间的联系,对我们后续做开发就提供了比较清晰的思路。有了实体模型,下一步就是思考代码。

三 代码实现

整体分为三层,model数据层, service逻辑层, controler视图层。

model数据层只关联底层数据模型,数据层面向逻辑层,对service层透明,屏蔽下游数据差异。 Servcie逻辑层处理核心业务逻辑,计算打包业务实体entiy,对应我们的需求,就是话题页面,包括话题和回帖列表,并上送给视图层。 Cortroller视图层负责处理和外部的交互逻辑,以view视图的形式返回给客户端,对于我们需求,我们封装json格式化的请求结果,api形式访问就好,

首先在main函数中使用gin框架完成路由搭建,并使用viper读取配置文件信息,初始化数据库。通过automigrate直接根据model初始化两个数据库表。

image.png

image.png

在controller层编写交互逻辑代码,主要是获取外部数据并进行参数转化,然后传给service层进行逻辑处理,根据service层传回来的数据构造返回的struct。

image.png

因为项目较为简单,我们直接在service层完成增删改查,gorm的使用也较为简单可以使用db.Where("Id = ?", topicId).Find(&topic)获取表中对应id的一行,使用db.Create(&post)直接在表中插入。这里就不再赘述了。 在编写代码的过程中我们可以使用wg sync.WaitGroup来进行并发控制,add为计数器加一,done是计数器减一,wait是阻塞知道计数器为0。

func (I *Info)QueryTopic(topicId int64) error{
	//获取topic信息
	db := common.GetDB()
	
	var wg sync.WaitGroup
	wg.Add(2)
	var topicErr, postErr error
	go func() {
		defer wg.Done()
		var topic model.Topic
		err := db.Where("Id = ?", topicId).Find(&topic).Error
		if err != nil {
			topicErr = err
			return
		}
		I.topicInfo = &topic
	}()
	//获取post列表
	go func() {
		defer wg.Done()
		var posts []*model.Post
		err := db.Where("topicId = ?", topicId).Find(&posts).Error
		if err != nil {
			postErr = err
			return
		}
		I.postInfo = posts
	}()
	wg.Wait()
	if topicErr != nil {
		return topicErr
	}
	if postErr != nil {
		return postErr
	}
	return nil
}

四 总结

以上就是对社区话题页面需求的整个实现流程,对于我有个没有什么开发经验的小白刚开始拿到整个项目需求是比较懵的,但是后面通过大拆小的思路,将大需求拆解为小需求的思路来分析解决,思路清晰了代码也慢慢构建起来了。