gpt4 book ai didi

go - serveHTTP 实用程序从哪里来的所谓的裸函数

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

我有这个工具:

type Handler struct{}

func (h Handler) Mount(router *mux.Router, v PeopleInjection) {
router.HandleFunc("/api/v1/people", h.makeGetMany(v)).Methods("GET")
}

上面调用这个:

func (h Handler) makeGetMany(v PeopleInjection) http.HandlerFunc {

type RespBody struct {}

type ReqBody struct {
Handle string
}

return tc.ExtractType(
tc.TypeList{ReqBody{},RespBody{}},
func(w http.ResponseWriter, r *http.Request) {
// ...
})
}

然后tc.ExtractType是这样的:

func ExtractType(s TypeList, h http.HandlerFunc) http.HandlerFunc {

return func(w http.ResponseWriter, r *http.Request) {

h.ServeHTTP(w, r) // <<< h is just a func right? so where does ServeHTTP come from?
}
}

我的问题是 - serveHTTP 方法/函数来自哪里??

h 参数不只是具有此签名的函数:

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

那么该函数如何附加 ServeHTTP 函数呢?

换句话说,我为什么打电话

h.ServeHTTP(w,r)

代替

h(w,r)

?

最佳答案

http.HandlerFunc是一种表示 func(ResponseWriter, *Request) 的类型。

http.HandlerFuncfunc(ResponseWriter, *Request) 的区别是:http.HandlerFunc 类型有一个名为 的方法ServeHTTP().

来自source code :

// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}

http.HandlerFunc() 可用于包装处理函数。

func Something(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// do something

next.ServeHTTP(w, r)
})
}

包装的处理程序将具有 http.HandlerFunc() 类型,这意味着我们将能够访问它的 .ServeHTTP() 方法。


还有另一种类型,一个叫做http.Handler的接口(interface)。 .它具有 .ServeHTTP() 方法签名,并且必须在嵌入接口(interface)的结构上实现。

type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}

正如您在上面的 Something() 函数中所见,需要一个 http.Handler 类型的返回值,但我们返回了一个包装在 http 中的处理程序.HandlerFunc()。没关系,因为 http.HandlerFunc 有方法 .ServeHTTP() 满足 http.Handler 接口(interface)的要求。


In other words, why I am I calling h.ServeHTTP(w,r) instead of h(w,r)?

因为要继续处理传入的请求,您需要调用 .ServeHTTP()

关于go - serveHTTP 实用程序从哪里来的所谓的裸函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577614/

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