golang Web框架综合比较
下面是Square工程师对当时几个流行的golang Web 框架比较,可作为选择web 框架参考。
推荐使用http://golang.org/pkg/net/http/ 16作为入门起步的标准库,如果你需要路由方面功能,可使用http://www.gorillatoolkit.org/ 12和https://github.com/gocraft/web 6,http://revel.github.io/ 13 和 http://martini.codegangsta.io/ 6有太多的依赖注入和其他魔术让人感觉舒服,Gorilla是最小的。
所有的Web框架都是基于net/http包构建的。
路由功能比较
路由是一种将Web请求映射到一个处理器函数的机制,路由是这些框架的基本功能,Gorilla似乎是最灵活的,但是它们基本上不相上下,一个重点是看看这个路由功能实现是否直接:
Revel:支持URL参数和通配符,举例, "/hotels/:id" 匹配正则 "/hotels/[^/]+";而"/hotels/*id"匹配"/hotels/.+"。一个revel应用在配置文件中指定路由。
Martini: 支持URL参数 通配符和正则表达式,举例: "/hotels/:id" 和"/hotels/**", 路由捆绑到一个特定的HTTP方法(GET POST HEAD等)
Gocraft/web:支持URL参数和正则表达式,如"/hotels/:id" 和 "/hotels/:id:[0-9]+", gocraft/web花费了更多努力在将路由结构成一个tree而不是list集合,这样能够获得更高性能。
Gorilla:支持URL参数,每个参数都可以用正则匹配,如"/hotels/{id}" 匹配正则 "/hotels/[^/]+",而 "/hotels/{id:[0-9]+}" 匹配正则 "/hotels/[0-9]+",除了基于URL的路由,Gorilla支持基于HTTP方法的路由,还有HTTP头、URL schema、查询参数、或任意函数,路由可通过程序指定。
数据绑定比较
数据绑定是将请求参数转换成处理器使用的机制,下面是它们在数据绑定方面的比较:
Revel: 匹配参数可以使用map[string]string,也可通过参数传给处理器方法,如"/hotels/:id"将被映射到Show(id int)方法,而id参数将自动填入,Revel的反射和注射使用非常神奇。
Martini: 匹配的参数也可通过 map[string]string 获得,它将被注入到处理器的方法参数,Martini提供完整的依赖注入到处理器方法的参数,允许指定全局或请求级别的映射,如果你喜欢依赖注入,你会觉得找到家了。
Gocraft/web:匹配的参数可以通过 map[string]string 获得,不像gorilla,它提供http.ResponseWriter 和 http.Request的包装器,参数是其字段,字段类型是web.Request。
Gorilla:匹配的参数可以通过 map[string]string 获得。这是通过mux.Vars(request)调用实现的,没有依赖注入, 没有魔术。
控制器比较
控制器或上下文context是用于维护每个请求的状态。
Revel: 控制器强概念,你的应用控制器嵌入一个*revel.Controller ,当从revel.Controller回到你的应用控制器类型时,有一点尴尬的类型断言转换。
Martini: 没有明显的控制器或上下文概念,但是依赖注入允许你易于创建你自己这样的概念。
Gocraft/web:路由和用户定义上下文结构联系,上下文结构通常由中间件完成。
Gorilla:不支持控制器和上下文,你自己实现。
中间件的比较
中间件是一个跨处理器提供通用功能的技术,比如日志就是一个中间件,注意,没什么神奇的基础设施来支持中间件。框架并不是调用一个单个处理器方法,而是调用一系列的方法。
- Revel:称中间件为 拦截器
- Martini:大多数功能是在中间件,包括第三方发布包
- Gocraft/web: 中间件是完全和一个上下文联系的,提供跨处理器的通用功能,比如用户授权。
- Gorilla: 不支持中间件,你自己实现
杂类比较
Revel:类似Rails,两个都是最全面、最固执己见的框架。提供路由,数据绑定,验证,会话,缓存,测试框架和国际化。指定的目录结构(比如区分单独的“模型”,“控制器”和“意见”目录)。见鬼,你甚至不用写main()功能,Revel为你生成一个。
Martini:灵感来自Express ( Node.js web框架) 和 Sinatra (a Ruby web 框架).
Gocraft/web : 一个库 不是一个框架
Gorilla: 由一系列独立的库包组成,可以取舍。
在以上分析中不倾向于任何全功能的框架。标准库的力量可以让我们在没有任何上述框架情况下构建复杂的应用程序,这些框架只是选项,Gorilla是我们最喜欢的因为它是微侵入。
原文 https://corner.squareup.com/2014/05/evaluating-go-frameworks.html 3 at May 22, 2014
Be the first to comment!
Relative Articles
Recent Go Articles
- Golang 把cookie 字符串解析为cookie 结构
- Golang 计算字符串中包含某个或某些字符集的个数
- 使用Golang 对文件增删写读操作备忘
- Go Modules 使用备忘
- 使用Golang 简单删除图片exif 信息
- 谷歌翻译的 golang 库推荐
- Go 1.13.2 与1.13.3 紧急更新
- golang 人脸检测识别库
- Go build 错误 “stackcheck redeclared in this block previous declaration”的解决方法
- Golang phantomjs 动态代理实现
- Golang chrome debug protocol 库推荐
- Golang 随机打乱数组/Slice
- Golang sync.WaitGroup 的 Wait 超时处理
- Golang实现简单的Socks5代理
- Golang 用snappy + Base64 简单压缩加密进行网络传输
- Golang http IPv4/IPv6 服务
- golang 全角半角相互转换
- 在自己的网站部署TLS 1.3
- Golang 实现/打印菜单树
- Golang telegram 机器人小试
Top Go Articles
- golang 当前时间、时间戳、时区的相互转化
- golang map 按value 大小排序,降序和升序
- golang regexp 正则表达式常见的用法
- golang 正确获取绝对路径的方法
- Golang 定时循环的实现
- golang 把上传文件转为byte
- Golang 时区时差处理方式
- golang 用正则包regexp 通过user-agent 识别手机浏览器
- GoLang 正则判断字符是不是中文
- golang 生成良好的唯一ID/uuid库比较
- Golang 把cookie 字符串解析为cookie 结构
- Golang 获取两个数之间的随机数
- golang 用gzip 压缩、解压缩字符串
- GoLang 计算小文件和大文件 md5 值的例子
- Golang Web 自动安装、更新Let’s Encrypt 免费证书
- go 获取硬盘的可用空间的方法
- golang 人脸检测识别库
- Golang 生成防识别的图片验证码
- Go build 错误 “stackcheck redeclared in this block previous declaration”的解决方法
- GoLang 实现python timedelta 函数功能