2016-01-31 4 views
1

Итак ... Я создаю RESTful API для моей идеи с помощью рамки джин, и я вошел в следующую проблему - Допустим, что у меня есть следующие конечные точки:Динамическое литье в Golang

/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)                                                 
    } 

Таким образом, очевидно, бизнес может стать пользователем или что-нибудь еще. Итак, после этого длинного изложения, мой вопрос к вам, как я могу предотвратить дублирование кода в такой ситуации? Я пробовал использовать интерфейс, но я все еще борется с природой OO от Go, поэтому я бы действительно предложил любую помощь.

Заранее благодарен!

ответ

5

Есть несколько вещей, которые вы можете сделать, чтобы уменьшить дублирование кода, но, к сожалению, вы всегда будете писать некоторый шаблон в go, из-за его явной обработки ошибок и отсутствия OOP-ness. (что не обязательно плохо!).

Так только мои предложения в данный момент, чтобы положить общие функциональные обработчики промежуточного ПО и реструктурировать свой код Литт, например:

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. Это должно дать вам довольно хороший обзор того, как структурировать ваш код.

+0

Большое спасибо за подробный ответ! – Yehonatan