gpt4 book ai didi

function - 这个Go函数类型 "HandlerFunc"是怎么工作的,来自标准库 "net/http"

转载 作者:IT王子 更新时间:2023-10-29 01:25:43 26 4
gpt4 key购买 nike

我对 this bit of code from the HTTP package 感到困惑:

type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}

为什么 ServeHTTP 方法具有与其类型完全相同的签名 - 这有什么意义?

测试,我发现如果我传递一个随机函数(foo)给HandlerFunc:

var bar = HandlerFunc(foo)

bar 成为 HandlerFunc 的一个实例,foo 作为它的 ServeHTTP 方法。现在我真的很困惑这到底是怎么回事。

如果我在一个类型上有多个方法,我如何知道哪个方法将附加到新实例以及使用什么名称或顺序?

最佳答案

这种方法允许您在需要 Handler 的上下文中使用函数。

发生的事情是,有一个 Handler 接口(interface):

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

并且各种函数被声明为接受被声明为属于该接口(interface)的参数——例如:

    func TimeoutHandler(h Handler, ns int64, msg string) Handler {
f := func() <-chan int64 {
return time.After(ns)
}
return &timeoutHandler{h, f, msg}
}

这意味着当你调用这样一个函数时,你必须传入一个属于满足这个接口(interface)的类型的对象,也就是说,一个具有ServeHTTP 具有适当签名的方法。 (在 Go 中,与某些语言不同,类型不需要显式实现接口(interface),它只需要具有接口(interface)指定的方法即可。)

因此,您引用的代码片段:

type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}

创建一个基于 func(ResponseWriter, *Request)HandlerFunc 类型,但是使用名为 ServeHTTP 的方法扩充该类型适当的签名,使其满足 Handler 接口(interface)。此 ServeHTTP 方法只是调用函数本身。所以,如果 f 是一个具有正确签名的函数,你可以这样写:

var h HandlerFunc = f    // h == f, but converted to a HandlerFunc
// so it satisfies the Handler interface.
TimeoutHandler(h, 1000000, "timed out")

澄清一些关于此的事情:

Testing, I discovered that if I pass a random function (foo) to the HandlerFunc:

var bar = HandlerFunc(foo)

bar becomes an instance of HandlerFunc with foo as its ServeHTTP method. Now I'm really confused about how on earth this works.

首先,更正确的说法是您已转换一个随机函数 foo 键入 HandlerFunc ,而不是你将函数传递给HandlerFunc,就像HandlerFunc是一个函数一样。 (HandlerFunc(foo) 表示法是类型转换;您也可以编写 var bar HandlerFunc = foo 并让转换隐式发生。)

其次,更正确的说法是 bar 有一个 ServeHTTP 方法 invokes foo,而不是foo 本身实际上 ServeHTTP 方法。

这有意义吗?

关于function - 这个Go函数类型 "HandlerFunc"是怎么工作的,来自标准库 "net/http",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690900/

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