gpt4 book ai didi

pointers - 为什么在 Go 中使用自定义 http.Handler 时使用指针?

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:47 24 4
gpt4 key购买 nike

在下面的代码片段中调用 http.Handle() 时,我使用了我自己的 templateHandler 类型,它实现了 http.Handler 界面。

package main

import (
"html/template"
"log"
"net/http"
"path/filepath"
"sync"
)

type templateHandler struct {
once sync.Once
filename string
templ *template.Template
}

func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
t.once.Do(func() {
t.templ = template.Must(template.ParseFiles(filepath.Join("templates", t.filename)))
})
t.templ.Execute(w, nil)
}

func main() {
http.Handle("/", &templateHandler{filename: "chat.html"})
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

现在由于某些原因,我必须使用 &templateHandler{filename: "chat.html"} 传递指向 http.Handle() 的指针。没有 & 我会收到以下错误:

cannot use (templateHandler literal) (value of type templateHandler) 
as http.Handler value in argument to http.Handle:
missing method ServeHTTP

为什么会发生这种情况?在这种情况下使用指针有什么区别?

最佳答案

http.Handle()期望一个实现 http.Handler 的值(任何值) ,这意味着它必须有一个 ServeHTTP() 方法。

您为 templateHandler.ServeHTTP() 方法使用了指针接收器,这意味着只有指向 templateHandler 的指针值有此方法,而非指针的没有templateHandler 类型。

Spec: Method sets:

A type may have a method set associated with it. The method set of an interface type is its interface. The method set of any other type T consists of all methods declared with receiver type T. The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).

非指针类型只有带有非指针接收者的方法。指针类型具有带有指针和非指针接收器的方法。

您的ServeHTTP() 方法修改了接收者,所以它必须是一个指针。但是如果其他处理程序不需要,ServeHTTP() 方法可以使用非指针接收器创建,在这种情况下,您可以使用非指针值作为 http .Handler,如本例所示:

type myhandler struct{}

func (m myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {}

func main() {
// non-pointer struct value implements http.Handler:
http.Handle("/", myhandler{})
}

关于pointers - 为什么在 Go 中使用自定义 http.Handler 时使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56652884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com