Golang: Web: Framework

12th January 2021 at 7:23pm
Golang: Web

流行的选择有 GinBeegoEchoBuffalo 等。

目前 Gin 最流行。当前(2021/01)我认为最好的选择是 Gin。

我体验过数个框架,在下面描述体验。

V2EX 上有人 认为

echo > gin > beego > net/http > iris / goframe / fiber

Echo

Echo 是我第一个选择的框架。因为之前有听说 Beego 代码比较差,我担心 Gin 的流行度也是因其先发优势,因而选择了没那么流行但是看起来也不错的 Echo。但实际用下来感觉 不如人意

  • 文档不够详细,比如我要做 validation,我需要去翻阅 validator 本身的文档,增加了时间。一样是用 validator 库,Gin 在文档上好一些,节约了时间
  • Router 在实现上不支持参数的简单校验。比如你只能设置一个 /users/:id 的 pattern,但是没法要求 ID 必须是数字;Gin 虽然也不支持直接设置 route param 的校验,但是有 ShouldBindUri 可以做校验
  • Echo 的 echo.Context.Bind() 不太合理,即处理 route param,又处理 body,这使得一些情况不好处理:

    你有一个路由 pattern:/users/:id,你想使用 PUT /users/1 修改用户信息。代码类似:

    type User struct {
        ID   int    `json:"id"`
        Name string `json:"name" validate:"required"`
    }
    
    func modifyUser(c echo.Context) error {
        user := User{}
        if err := c.Bind(&user); err != nil {
            return err
        }
    }

    此时如果你的 body 是:

    {
      "id": 2
      "name": "P"
    }

    那么 c.Bind() 得到的 id 是 2 而不是 1。这在我看来很糟糕,把路由参数和 body 的参数混杂在一起。

Buffalo

Buffalo 是我在对 Echo 失望后第一个去了解的框架。Buffalo 和 Gin 都是走大而全路线。Buffalo 的 文档让我觉得一般,而且它的 ORM 是自制的,我怀疑它有没有能力做得很好。网上有文章表示 Buffalo is a mess。

我认为 Buffalo 与 Gin 定位相同,但流行度大不如 Gin,所以没必要用 Buffalo 而应该用 Gin。