Function Go函数类型
我很困惑: 为什么Function Go函数类型,function,types,go,Function,Types,Go,我很困惑: 为什么ServeHTTP方法具有与其类型完全相同的签名-这有什么意义 通过测试,我发现如果我将一个随机函数(foo)传递给HandlerFunc: var bar = HandlerFunc(foo) var bar = HandlerFunc(foo) bar成为HandlerFunc的一个实例,其中foo作为其servehtp方法。现在我真的很困惑这到底是怎么回事 如果一个类型上有多个方法,我如何知道哪个方法将附加到新实例,以及使用什么名称或顺序?此方法允许您在需要处理程序的
ServeHTTP
方法具有与其类型完全相同的签名-这有什么意义
通过测试,我发现如果我将一个随机函数(foo
)传递给HandlerFunc
:
var bar = HandlerFunc(foo)
var bar = HandlerFunc(foo)
bar
成为HandlerFunc
的一个实例,其中foo
作为其servehtp
方法。现在我真的很困惑这到底是怎么回事
如果一个类型上有多个方法,我如何知道哪个方法将附加到新实例,以及使用什么名称或顺序?此方法允许您在需要
处理程序的上下文中使用函数
发生的是,有一个处理程序
接口:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
并声明各种函数以接受声明属于此接口的参数,例如:
func TimeoutHandler(h Handler, ns int64, msg string) Handler {
f := func() <-chan int64 {
return time.After(ns)
}
return &timeoutHandler{h, f, msg}
}
创建一个基于func(ResponseWriter,*Request)
的类型HandlerFunc
,但使用名为ServeHTTP的方法和适当的签名来扩充该类型,以便满足Handler
接口的要求。这个ServeHTTP
方法只调用函数本身。因此,如果f
是一个具有正确签名的函数,您可以编写如下内容:
var h HandlerFunc = f // h == f, but converted to a HandlerFunc
// so it satisfies the Handler interface.
TimeoutHandler(h, 1000000, "timed out")
要澄清这方面的一些问题:
通过测试,我发现如果我将一个随机函数(foo
)传递给HandlerFunc
:
var bar = HandlerFunc(foo)
var bar = HandlerFunc(foo)
变量条=HandlerFunc(foo)
bar
成为HandlerFunc
的一个实例,其中foo
作为其servehtp
方法。现在我真的很困惑这到底是怎么回事
首先,更正确的说法是将随机函数foo
转换为typeHandlerFunc
,而不是将函数传递给HandlerFunc
,好像HandlerFunc
是一个函数。(HandlerFunc(foo)
符号是一种类型转换;您可以编写var bar HandlerFunc=foo
,并隐式进行转换。)
其次,更正确的说法是,bar
有一个调用foo
的servehtp
方法,而foo
本身实际上就是servehtp
方法
这有意义吗?+1的解释。当涉及到令人满意的接口时,函数可以像对象一样被对待,这非常酷。谢谢,这让事情变得更清楚了。围棋确实是一种不同寻常的语言,但在里面,一切都很简单。新年快乐,顺便说一句:)。