2020 年末了,目前的 Go web 框架怎么选?

2020-12-01 14:34:53 +08:00
 HaroldChen

想用 Go 写点东西,看了不少帖子,gin, echo 的名字出现的频率很高,后来发现了 iris,看了框架作者的对比 https://github.com/kataras/iris/issues/1396,觉得也有一定优势。

目前的疑问是,为什么 gin 的热度这么高呢(先发优势+易用性?),iris 是否可以考虑使用,缺陷在哪?

21146 次点击
所在节点    Go 编程语言
70 条回复
mason961125
2020-12-01 21:56:49 +08:00
问就是 echo
ly020044
2020-12-01 22:04:21 +08:00
@cryingsky 我也推荐这个,github.com/gofiber/fiber 。它有很多中间件、文档清晰、作者好像是全职维护
FreeEx
2020-12-01 22:11:32 +08:00
刚从 gin 换 echo,gin 的路由冲突就像吃了苍蝇一样难受
FreeEx
2020-12-01 22:13:37 +08:00
另外 gin 没全局异常处理,路由函数不能直接 return err,实在想不通为啥那么多人推荐。
Cyanhall
2020-12-01 22:14:41 +08:00
看热度基本是在 Gin 和 Echo 两个间选了

参考 - 最流行的 Go Web 框架: https://www.cyanhall.com/cn/top/go-web-framework/
yrj
2020-12-01 22:26:13 +08:00
iris 是基于 fasthttp 的,性能更高,安利一下 fiber,也是,路由比 iris 更好。
Hanggi
2020-12-01 22:52:56 +08:00
@FreeEx
这种时候其实应该从自身找找原因,为什么那么多人用 gin ?
搞清楚了可能就进一步了解 go 语言了。
FreeEx
2020-12-01 22:55:08 +08:00
@Hanggi 找到了啊,gin 就是不好用
qloog
2020-12-01 23:03:10 +08:00
gin 吧,简单性能也好,大厂也用的多
shanechiu
2020-12-01 23:36:05 +08:00
@yrj 2021 年了,性能真的不是首选目标,用 echo 吧,方便。
FightPig
2020-12-01 23:53:27 +08:00
自己写,直接用各种自己拼
kylidboy
2020-12-02 00:15:55 +08:00
aah
Akashic
2020-12-02 00:21:38 +08:00
之前用 Iris,遇到过没有跨大版本,接口变了的情况🙃
fewok
2020-12-02 00:35:42 +08:00
@cryingsky 比较新,不过貌似最近很多大牛都点赞
kevinwan
2020-12-02 00:44:31 +08:00
服务治理,工具完备,go-zero 可以看看🤩
https://github.com/tal-tech/go-zero
sunmoon1983
2020-12-02 08:37:59 +08:00
goFrame
danbai
2020-12-02 09:04:05 +08:00
@sunmoon1983 #36 +1
eudore
2020-12-02 09:04:09 +08:00
给大家转发下我在 learnku 上写的答案,安利 fiber 的都辣鸡。

自己阅读过 echo gin http.Server 全部、beego 大部分、iris 少量代码,
net/http 体系下 echo > gin > beego > net/http > iris 、goframe 、fiber,下面列出我自己看到的一些不足,不推荐 fasthttp 原因生态相对弱,仅支持 http/1.1 。

echo 中间件闭包消耗大量资源(每一个中间件的成本与其他框架不成比例),router any 方法不具有优先级。单元测试:84%

gin Context 不合理的实现 context.Context 接口(尝试性传递 ctx 会出未知问题),Context 非接口无法扩展,没有内置 Logger 无法自动输出 err (所有 err 必须处理,否在运行出现了 err 自己都不知道),validator 注册不合理( v8 、v9 、v10 可能注册到不同版本里面去了),不支持路由优先级和 any 方法优先级(从 httprouter 继承的问题)。单元测试:98%

beego 程序是单例,代码复杂度过高一个核心方法 200+行( ServeHTTP 方法),内置对象太多导致框架过重无法扩展(内置嵌入了 csrf 、session 等功能但并不需要),体系相对成熟。单元测试:无公开数据

iris 代码抄袭 篡改 git 历史(抄袭 httprouter 被锤改 git 历史 [https://github.com/avelino/awesome-go/pull/1135]( https://github.com/avelino/awesome-go/pull/1135)) 删除老版本代码( git 历史改了一些版本代码没了,老项目无法编译了),httptest 库测试 iris 会 panic,最新版本 api 设计还是不合理,中间件机制少个 for 导致设计极差不合理,HandleDone 方法画蛇添足使用不便,稳定性差每个大版本 api 全变(都 v12 还不合理怎么会稳定)。单元测试:无公开数据 自己单元测试引入 iris 触发 panic

goframe 以前看到的 gmap 组件的软文(18 年),单线程去对比测试 sync.Map ,得出的比 sync.Map 块一倍性能结果 2020 年看还在,这样低级错误严重怀疑水平,大部分代码是工具相关内容。单元测试: 69%

fiber: 低性能 for 循环路由器,没有单元测试,存在 Race Data 导致的 bug 。

关于性能都差不多的没有可以拉开性能差距的地方,随便学一个源码就可以了,结构都差别的没啥难点,看公司需要使用什么。echo 和 gin 加上依赖一共也都有 100 多 M,学那个框架都避不开 net/http 库,这个才是根本。

------------------------------------------------------------------------------------------------------
路由器实现,也都是渣渣。

httprouter 高性能 不支持路由优先级和 any 方法优先级,代码复杂度太高。

chi 中等性能,支持路由优先级,资源消耗是 httprouter 时间 5 倍、内存 10 倍

mux 非高性能路由器实现(没测试,但是实现方法至少慢 20 倍以上,看别人测试数据是比 httprouter 慢 300 倍),使用链式 api 太繁琐与其他库使用方法差距较大同时不具有明显独特优势。
meshell
2020-12-02 09:15:13 +08:00
@cryingsky 我用得这个 +1
ohoh
2020-12-02 09:31:04 +08:00
@eudore 有推荐的吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/730965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX