Search code examples
pointersgo

In Go HTTP handlers, why is the ResponseWriter a value but the Request a pointer?


I'm learning Go by writing an app for GAE, and this is signature of a handler function:

func handle(w http.ResponseWriter, r *http.Request) {}

I'm pointer newbie here, so why is the Request object a pointer, but the ResponseWriter not? Is there any need to have it this way or is this just to make some kind of advanced pointer based code possible?


Solution

  • What you get for w is a pointer to the non exported type http.response but as ResponseWriter is an interface, that's not visible.

    From server.go:

    type ResponseWriter interface {
        ...
    }
    

    On the other hand, r is a pointer to a concrete struct, hence the need to pass a reference explicitly.

    From request.go:

    type Request struct {
        ...
    }