不懂 Go 中的组合

在下面的示例中,我已嵌入http.ResponseWriter到我自己的名为Response. 我还添加了一个名为Status. 为什么我不能从我的root处理程序函数内部访问该字段?


当我打印出w根处理程序函数中的类型时main.Response,它说它的类型看起来是正确的,当我打印出结构的值时,我可以看到它Status在那里。为什么我不能通过 go 访问w.Status?


这是标准输出的内容:


main.Response

{ResponseWriter:0xc2080440a0 Status:0}

代码:


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) // <--- This causes an error.

}


func main() {

    http.Handle("/", middleware(http.HandlerFunc(root)))

    http.ListenAndServe(":8000", nil)

}


繁花不似锦
浏览 156回答 1
1回答

慕侠2389804

w是一个类型的变量http.ResponseWriter。ResponseWriter没有字段或方法Status,只有您的Response类型。http.ResponseWriter是一种接口类型,并且由于您的Response类型实现了它(因为它嵌入了ResponseWriter),该w变量可能包含动态类型的值Response(在您的情况下它确实如此)。但是要访问该Response.Status字段,您必须将其转换为 type 的值Response。为此使用类型断言:if resp, ok := w.(Response); ok {&nbsp; &nbsp; // resp is of type Response, you can access its Status field&nbsp; &nbsp; fmt.Println(resp.Status) // <--- properly prints status}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go