Show HN: Gin – Golang Martini-like web framework
gin-gonic.github.io
gin-gonic.github.io
Quite an unfortunate choice of name.
Anyway, Gin looks nice too. I like how the routing groups are done.
I used Negroni with httprouter and it is a bliss. Just a note, gin is also a codegangsta tool to live reload your Martini/Negroni app.
Gin is also a better fit for httpRouter, it's not designed to fit any other framework. I wanted Gin to share the same philosophy than HttpRouter. Basically the Gin/HttpRouter community cares about performance, so you don't. For example in Gin, you can created thousands of nested groups and the performance will be still the same.
Gin is full-featured, to me it means: control flow, middlewares, error management (errors and panics both), easy rendering, easy validation, easy data passing between middlewares. For example you can collect errors (not only panics) and then send them to Sentry easily.
The control flow is interesting: if a middleware calls c.Abort(code) or c.Fail(code, message), the rest handlers in the chain would never be called, this is very useful when authorisation is required. https://github.com/gin-gonic/gin/blob/master/auth.go#L76
Of course authorisation can be just applied to a group, you can see example in the github page. Per-group middlwares and even per-request middlewares!
We added all that features without making it significantly slower (compared to httprouter) and for sure that overhead will be reduced in upcoming releases (no API changes). If you want to use HttpRouter and you also want cool features, in my opinion Gin is one of the best choices. Just try it.
I implemented almost the same features as Negroni's middlewares [0] in my project (a backend for grassroots referendums). I was even asked to do a Sentry middleware [1] to improve it.
I would advise you against merging projects. It would be great if you separate the route grouping code and release it as an independent library to build on httprouter (even merging them) and keep Gin as it is.
Although, my question was performance-wise because I think Negroni will be similar in performance.
[0] https://github.com/imdario/minshu/blob/master/minshu-server/... [1] https://github.com/imdario/minshu/issues/1
Apparently people are too lazy to write "Go Programming Language" on their searches.
Just a tip, to compare martini with Gin, you can run this:
go test --bench="(Gin|Martini)"
It seems you could have just helped codegangsta along instead of "yet another web framework in Go."
In the same kind of Martini-like web frameworks that don't use reflection, there is also Goji - http://goji.io.
First. Martini uses reflection, it's IMPOSSIBLE to make it as fast as Gin without removing all the reflection. Obviously it would break all the API, it would not be Martini anymore.
Martini is not slow because a bug, it's slow by design.
Second, Gin uses the fastest http router available, HttpRouter. I strongly believe that people should use HttpRouter, it will work perfect for you unless you need regex to validate the URL. The problem is that HttpRouter is not strongly featured, it lacks things like groups, middlwares, error management, control flow, rendering...
One requirement for my startup was high performance, HttpRouter was the best choice, we added a very lightweight system on top of it, so developers are happier.
The final results, from 20x to 40x times the performance.
As I said, if you need performance and productivity Gin is probably a good way to go :) I hope it was useful.
I just hate "yet another xxx in yyy" projects, but I'm not downplaying the work involved.
But again, this project (Gin) is completely unrelated to Martini. Martini itself is not that old; deprecating it would be pretty poor form given that refactoring your project to work with Gin would be A Big Deal.
If the author had forked Martini your argument would have made more sense, but we shouldn't be afraid of building something new just because someone else broke similar ground before.
You say deprecating it is poor form, yet this guy just built a "better" version of the framework and says we should switch to it. I don't see how that's any classier than just saying "Martini sucks."