struct - Don't understand composition in Go -


in example below i've embedded http.responsewriter own struct called response. i've added field called status. why can't access field inside root handler function?

when print out type of w in root handler function says it's of type main.response seems correct , when print out values of struct can see status there. why can't access going w.status?

this contents of stdout:

main.response {responsewriter:0xc2080440a0 status:0} 

code:

package main  import (     "fmt"     "reflect"      "net/http" )  type response struct {     http.responsewriter     status int }  func (r response) writeheader(n int) {     r.status = n     r.responsewriter.writeheader(n) }  func middleware(h http.handler) http.handler {      return http.handlerfunc(func(w http.responsewriter, r *http.request) {          resp := response{responsewriter: w}          h.servehttp(resp, r)     }) }  func root(w http.responsewriter, r *http.request) {     w.write([]byte("root"))     fmt.println(reflect.typeof(w))     fmt.printf("%+v\n", w)     fmt.println(w.status) // <--- causes error. }  func main() {     http.handle("/", middleware(http.handlerfunc(root)))     http.listenandserve(":8000", nil) } 

w variable of type http.responsewriter. responsewriter not have field or method status, response type.

http.responsewriter interface type, , since response type implements (because embeds responsewriter), w variable may hold value of dynamic type response (and in case does).

but access response.status field, have convert value of type response. use type assertion:

if resp, ok := w.(response); ok {     // resp of type response, can access status field     fmt.println(resp.status) // <--- prints status } 

Comments

Popular posts from this blog

c++ - Difference between pre and post decrement in recursive function argument -

php - Nothing but 'run(); ' when browsing to my local project, how do I fix this? -

php - How can I echo out this array? -