所以...我正在使用Gin框架为我的想法创建一个RESTful API,而且我遇到了以下问题 - 让我们说我有以下终点:
/a/:id/*action
/b/:id/*action
/c/:id/*action
所以,显然,当我没有给出任何动作时,我想返回给定ID的数据。意思是,除了查询一些数据并返回它之外我什么都不做,这意味着功能基本相同,只返回的数据不同。
这是我的一个示例代码 -
func GetBusiness(c *gin.Context) {
businessID, err := strconv.Atoi(c.Param("id"))
if businessID == 0 || err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "errorMessage": "Missing ID"})
}
business := &Business{}
business, err = business.Get(businessID)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "errorMessage": "Business not found"})
}
c.JSON(http.StatusOK, business)
}
因此,显然,业务可以成为用户或其他任何东西。所以,经过长时间的阐述,我向你的观众提出的问题是,如何在这种情况下防止代码重复?我尝试过使用界面,但我仍然在努力解决Go的OO性质,所以我真的很乐意帮助你。
提前致谢!
答案 0 :(得分:5)
您可以采取一些措施来减少代码重复,但不幸的是,您将始终在编写一些样板文件,因为它具有明确的错误处理和缺乏OOP-ness。 (这不一定是坏事!)。
所以我目前唯一的建议是将常用功能放在中间件处理程序中,并将代码重构为litte,例如:
parseIdMiddleware := func(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if businessID == 0 || err != nil {
c.AbortWithError(http.StatusBadRequest, errors.New("Missing ID"))
return
}
c.Set("id", id)
}
...
gin.Use(gin.ErrorLogger(), parseIdMiddleware)
并将处理程序重写为
func GetBusiness(c *gin.Context) {
id := c.MustGet("id").(int)
business, err := store.GetBusiness(id)
if err != nil {
c.AbortWithError(http.StatusBadRequest, err)
return // don't forget this!
}
c.JSON(http.StatusOK, business)
}
和往常一样,阅读其他人的代码!我推荐https://github.com/drone/drone。这应该可以很好地概述如何构建代码。