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
转换为type
HandlerFunc
,而不是将函数传递给
HandlerFunc
,好像
HandlerFunc
是一个函数。(HandlerFunc(foo)
符号是一种类型转换;您可以编写
var bar HandlerFunc=foo
,并隐式进行转换。)

其次,更正确的说法是,
bar
有一个调用
foo
servehtp
方法,而
foo
本身实际上就是
servehtp
方法


这有意义吗?

+1的解释。当涉及到令人满意的接口时,函数可以像对象一样被对待,这非常酷。谢谢,这让事情变得更清楚了。围棋确实是一种不同寻常的语言,但在里面,一切都很简单。新年快乐,顺便说一句:)。