Golang中的动态转换

Yeh*_*tan 1 oop rest dry go

所以......我正在使用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)                                                                                                                                                                                                   
   }   
Run Code Online (Sandbox Code Playgroud)

因此,显然,业务可以成为用户或其他任何东西.所以,经过长时间的阐述,我向你的观众提出的问题是,如何在这种情况下防止代码重复?我已经尝试过使用界面,但我仍然在努力解决围棋的OO性质,所以我真的很喜欢任何帮助.

提前致谢!

fl0*_*cke 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)
Run Code Online (Sandbox Code Playgroud)

并重写你的处理程序

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)
}
Run Code Online (Sandbox Code Playgroud)

和往常一样,阅读其他人的代码!我推荐https://github.com/drone/drone.这应该可以很好地概述如何构建代码.