I have been learning GO Lang for a month now. I have been coding in java for more than 4 years. In java the Request and Response both are object references. But, when it comes to GoLang the Response is a object reference and the Request is a Pointer Reference.
A reference, like a pointer, is an object that you can use to refer indirectly to another object. A reference declaration has essentially the same syntactic structure as a pointer declaration.
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
}
Apart from the readability perspective and the syntactic sugar is there any other intention behind using the Request as a pointer variable.
Adding to the above question the request here is an arbitrary pointer. i.e the request is not yet exists but the pointer is already referring to a memory location. Please throw some light if my understanding is wrong.
As correctly mentioned in many other answers here and elsewhere, ResponseWriter is an interface and the implications of this have beed described in detail in SO answers and blogs.
What I would like to address is what I feel is the big—and dangerous—misconception here, that the reason request is passed by "reference" (although such a thing does not really exist in Go) is that "we want to make changes to it visible to the server".
Quoting a couple of answers from other people:
[..]it's just a struct, and since we want to change this struct and have the web server see those changes, it has to be a pointer[..] SO
[..]changes to Request by the handler need to be visible to the server, so we’re only passing it by reference instead of by value [..] SO
This is wrong; in fact the docs explicitly warn against tampering with / mutating the request:
Except for reading the body, handlers should not modify the provided Request.
Quite the opposite, no? :-)
If you want to change the request, e.g. append a tracing header before passing it on to the next handler in a middleware chain you have to copy the request and pass the copied version down the chain.
Why use a pointer if we are explicitly telling people not to mutate the request? Performance, Request is a large struct and copying it can bring performance down, especially with long middleware chains in mind. The team had to strike a balance, definitely not an ideal solution, but the tradeoffs are clearly on the side of performance here (instead of API safety).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With