Golang中的动态转换

时间:2016-01-31 13:20:16

标签: rest oop go dry

所以...我正在使用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性质,所以我真的很乐意帮助你。

提前致谢!

1 个答案:

答案 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。这应该可以很好地概述如何构建代码。