流行的选择有 Gin、Beego、Echo、Buffalo 等。
目前 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。