这是Square工程师对几个Go语言的Web框架比较:A Comparison of Go Web Frameworks
推荐使用net/http作为入门起步的标准库,如果你需要路由方面功能,可使用Gorilla和Gocraft/web,Revel 和 Martini有太多的依赖注入和其他魔术让人感觉舒服,Gorilla是最小的。
所有的Web框架都是基于net/http包构建的。
路由功能比较
路由是一种将Web请求映射到一个处理器函数的机制,路由是这些框架的基本功能,Gorilla似乎是最灵活的,但是它们基本上不相上下,一个重点是看看这个路由功能实现是否直接:
1.Revel:支持URL参数和通配符,举例, "/hotels/:id" 匹配正则 "/hotels/[^/]+";而"/hotels/*id"匹配"/hotels/.+"。一个revel应用在配置文件中指定路由。
2.Martini: 支持URL参数 通配符和正则表达式,举例: "/hotels/:id" 和"/hotels/**", 路由捆绑到一个特定的HTTP方法(GET POST HEAD等)
3.Gocraft/web:支持URL参数和正则表达式,如"/hotels/:id" 和 "/hotels/:id:[0-9]+", gocraft/web花费了更多努力在将路由结构成一个tree而不是list集合,这样能够获得更高性能。
4. Gorilla:支持URL参数,每个参数都可以用正则匹配,如"/hotels/{id}" 匹配正则 "/hotels/[^/]+",而 "/hotels/{id:[0-9]+}" 匹配正则 "/hotels/[0-9]+",除了基于URL的路由,Gorilla支持基于HTTP方法的路由,还有HTTP头、URL schema、查询参数、或任意函数,路由可通过程序指定。
数据绑定比较
数据绑定是将请求参数转换成处理器使用的机制,下面是它们在数据绑定方面的比较:
1. Revel: 匹配参数可以使用map[string]string,也可通过参数传给处理器方法,如"/hotels/:id"将被映射到Show(id int)方法,而id参数将自动填入,Revel的反射和注射使用非常神奇。
2.Martini: 匹配的参数也可通过 map[string]string 获得,它将被注入到处理器的方法参数,Martini提供完整的依赖注入到处理器方法的参数,允许指定全局或请求级别的映射,如果你喜欢依赖注入,你会觉得找到家了。
3.Gocraft/web:匹配的参数可以通过 map[string]string 获得,不像gorilla,它提供http.ResponseWriter 和 http.Request的包装器,参数是其字段,字段类型是web.Request。
4.Gorilla:匹配的参数可以通过 map[string]string 获得。这是通过mux.Vars(request)调用实现的,没有依赖注入, 没有魔术。
控制器比较
控制器或上下文context是用于维护每个请求的状态。
1.Revel: 控制器强概念,你的应用控制器嵌入一个*revel.Controller ,当从revel.Controller回到你的应用控制器类型时,有一点尴尬的类型断言转换。
2.Martini: 没有明显的控制器或上下文概念,但是依赖注入允许你易于创建你自己这样的概念。
3.Gocraft/web:路由和用户定义上下文结构联系,上下文结构通常由中间件完成。
4.Gorilla:不支持控制器和上下文,你自己实现。
中间件的比较
中间件是一个跨处理器提供通用功能的技术,比如日志就是一个中间件,注意,没什么神奇的基础设施来支持中间件。框架并不是调用一个单个处理器方法,而是调用一系列的方法。
1. Revel:称中间件为 拦截器
2. Martini:大多数功能是在中间件,包括第三方发布包
3. Gocraft/web: 中间件是完全和一个上下文联系的,提供跨处理器的通用功能,比如用户授权。
4.Gorilla: 不支持中间件,你自己实现
杂类比较
1.Revel:类似Rails,两个都是最全面、最固执己见的框架。提供路由,数据绑定,验证,会话,缓存,测试框架和国际化。指定的目录结构(比如区分单独的“模型”,“控制器”和“意见”目录)。见鬼,你甚至不用写main()功能,Revel为你生成一个。
2.Martini:灵感来自Express ( Node.js web框架) 和 Sinatra (a Ruby web 框架).
3.Gocraft/web : 一个库 不是一个框架
4.Gorilla: 由一系列独立的库包组成,可以取舍。
在以上分析中不倾向于任何全功能的框架。标准库的力量可以让我们在没有任何上述框架情况下构建复杂的应用程序,这些框架只是选项,Gorilla是我们最喜欢的因为它是微侵入。