在下面的示例中,我已嵌入http.ResponseWriter到我自己的名为Response. 我还添加了一个名为Status. 为什么我不能从我的root处理程序函数内部访问该字段?当我打印出w根处理程序函数中的类型时main.Response,它说它的类型看起来是正确的,当我打印出结构的值时,我可以看到它Status在那里。为什么我不能通过 go 访问w.Status?这是标准输出的内容:main.Response{ResponseWriter:0xc2080440a0 Status:0}代码:package mainimport ( "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)}
1 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
w是一个类型的变量http.ResponseWriter。ResponseWriter没有字段或方法Status,只有您的Response类型。
http.ResponseWriter是一种接口类型,并且由于您的Response类型实现了它(因为它嵌入了ResponseWriter),该w变量可能包含动态类型的值Response(在您的情况下它确实如此)。
但是要访问该Response.Status字段,您必须将其转换为 type 的值Response。为此使用类型断言:
if resp, ok := w.(Response); ok {
// resp is of type Response, you can access its Status field
fmt.Println(resp.Status) // <--- properly prints status
}
- 1 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消