- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有这个工具:
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.HandlerFunc
和 func(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 ofh(w,r)
?
因为要继续处理传入的请求,您需要调用 .ServeHTTP()
。
关于go - serveHTTP 实用程序从哪里来的所谓的裸函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577614/
我有这个工具: type Handler struct{} func (h Handler) Mount(router *mux.Router, v PeopleInjection) { ro
我正在学习 Golang 的网络开发(初学者)我遇到了一些我玩过的代码,但我不太确定它为什么有效,我查看了库源代码和文档,但我只有一个模糊的想法仍然没有点击。请注意以下代码: package main
我正从 Java 转向 go。在“go”中,我在使用 Handler 时感到困惑。 例如:ServeHTTP(w http.ResponseWriter, req *http.Request) 这里的
我想将 func StripPrefix 包装在另一个函数中,并在创建文件服务器之前进行一些客户端 session 检查。所有 session 都存储在一个 MySQL 数据库表中,用于为一个网站实现
超时处理程序在新的 goroutine 上移动 ServeHTTP 执行,但无法在计时器结束后终止该 goroutine。对于每个请求,它都会创建两个 goroutine,但 ServeHTTP go
Go 中的 ServeHTTP 函数如何计算发送和接收的字节数? 计数需要相对准确。跳过连接建立并不理想,但可以接受。但必须包含 header 。 它还需要快速。迭代通常太慢。 计数本身不需要发生在
我正在尝试为我的 http 文件服务器编写单元测试。我已经实现了 ServeHTTP 函数,以便它在 URL 中用“/”替换“//”: type slashFix struct { mux h
在这里已经得到了一些帮助,这让我在我正在尝试的这个概念上取得了进展,但它仍然不太奏效,我遇到了一个我似乎无法解决的冲突。 我在这里尝试在流程图中说明我想要的内容 - 请注意,客户端可以是许多将发送 p
我试图在 Go 中使用 gorilla mux 构建基本的 Web API。这是我的代码。请帮助我了解一些接口(interface)是如何在这里工作的。 func main() { r :=
我的代码和错误信息在这里:https://gist.github.com/WithGJR/a700e5d5bd35b5c8eef2 谁能为我解释为什么会出现这个错误以及如何解决它?谢谢。 最佳答案 因
我是一名优秀的程序员,十分优秀!