Routing Enhancements for Go 1.22
go.dev
go.dev
A panic? That's a bad dev experience. Why not say an earlier variable is more general -- or a later variable is more specific? /posts/{id} wins.
Consider /posts/{id} vs:
/posts/latest/{u} // wins (later variable)
/posts/{id}/latest // wins (more specific)
/posts/{id}/{id2} // wins (later variable. id2 must exist)
/{u}/posts/ // lose (earlier variable)
/posts/{otherId} // invalid (same path with different name)
/latest/{u} // no conflictSure. That's precisely what exceptions (panics) are for: To deal with programmer mistakes identified at runtime that the compiler failed to detect. The use is appropriate.
If you want perfect compile-time safety, Go is not it. It prioritizes other tradeoffs. Such is engineering.
“In Go 1.22, the existing code will continue to work, or you could instead write this:
http.Handle("GET /posts/{id}",
handlePost2)
”Can anybody explain why they chose such a stringified approach for the API and not
http.Handle(Http.GET, "/posts/{id}",
handlePost2)
or, if they don’t want to restrict the set of http verbs, http.Handle("GET", "/posts/{id}",
handlePost2)
? I think either would be a better API.I still think it would not be good, though. For me ‘Handle’ sounds like an instruction to do something, but it only adds/registers a handler.
Also, why require multiple calls to, essentially, pass a set of (pattern, handler) pairs? I think I would have chosen to make a single call “here are the patterns to register and their handlers”. Most tools would have to make only one such call.
It possibly also could be more efficient because the API wouldn’t have to have intermediate states where it can handle one type of request, than 2, 3, etc.
Why keep {id}, then? Why not remove the string processing entirely? You may mistype it. You lose better autocomplete. Seems like there is room for significant improvement, not just a minor change. To which there is still an opportunity to introduce a another API, so it's worth finding it.