为了账号安全,请及时绑定邮箱和手机立即绑定

不懂 Go 中的组合

不懂 Go 中的组合

Go
繁花不似锦 2021-10-04 18:09:24
在下面的示例中,我已嵌入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

}


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信