为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的动态转换

Golang 中的动态转换

Go
MM们 2021-12-07 17:02:57
所以......我正在使用 Gin 框架为我的想法创建一个 RESTful API,我遇到了以下问题 - 假设我有以下端点:/a/:id/*action/b/:id/*action/c/:id/*action所以,很明显,当我不采取任何行动时,我想返回给定 ID 的数据。意思是,我除了查询一些数据并返回它之外什么都不做,这意味着功能基本相同,只有返回的数据不同。因此,显然,业务可以成为用户或其他任何东西。所以,经过这么长时间的阐述,我对各位观众的问题是,在这种情况下,如何防止代码重复?我已经尝试过使用接口,但我仍然在为 Go 的面向对象性质而苦苦挣扎,所以我真的很乐意提供任何帮助。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

你可以做一些事情来减少代码重复,但不幸的是,你总是会在 go 中编写一些样板,因为它有明确的错误处理和缺乏 OOP 性。(这不一定是坏事!)。


因此,我目前唯一的建议是将通用功能放在中间件处理程序中并稍微重构您的代码,例如:


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。这应该让您对如何构建代码有一个很好的概述。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信