gpt4 book ai didi

戈兰;难以理解作为接收者的函数

转载 作者:行者123 更新时间:2023-12-02 13:49:03 32 4
gpt4 key购买 nike

我正在尝试阅读此内容:https://blog.golang.org/error-handling-and-go特别是标题为简化重复错误处理的部分。

他们像这样调用http.Handle:

func init() {
http.Handle("/view", appHandler(viewRecord))
}

http.Handle 的第二个参数需要一个 Handler 类型 ( https://golang.org/pkg/net/http/#Handler ),它需要有一个 serveHttp 方法。

此处的 serveHttp 函数:

func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := fn(w, r); err != nil {
http.Error(w, err.Error(), 500)
}
}

所以,他们的类型 appHandler 现在实现了 Handler 接口(interface),因为它实现了 ServeHTTP,我明白了。因此它可以在 Handle 函数中使用,而 viewRecord 则不能。

让我感到困惑的是 viewRecord (类型为 appHandler)和 ServeHTTP 之间的关系。哪个调用哪个?他们对“函数也可以是接收器”做了一个附加评论,我认为这就是我被绊倒的地方。

在这里,以 fn appHandler 作为接收器,我期望类似 viewRecord.serveHTTP() 的东西,但这没有意义,而 viewRecord 是一个函数。我认为正在发生的事情是 Handle 函数调用 serveHTTP,但是 serveHTTP 是如何调用 viewRecord 的呢? p>

appHandler(viewRecord) 也进行强制转换吗?

基本上,我正在寻找关于函数作为接收者的含义的一些澄清。我是新手,我想我不小心落在了这里的一个不平凡的地雷上。

最佳答案

任何类型都可以是接收者。例如:

type X int

这里,X 是一个新类型,您可以为其创建方法:

func (x X) method() {
// Do something with x
}

在 Go 中,函数与任何其他类型一样。因此,如果您有一个函数类型:

type F func()

这里,F 是一个新类型,因此您可以为其定义方法:

func (x F) method() {
x()
}

通过上述声明,如果 value 的类型为 F,现在您可以调用 value.method()

a:=F(func() {fmt.Println("hey")})
a.method()

这里,aF类型的变量。 F 有一个名为 method 的方法,因此您可以调用 a.method。当您调用它时,a.method 会调用 a,它是一个函数。

回到您的示例,appHandler 似乎是一个函数类型:

type appHandler func(http.ResponseWriter, *http.Request)

因此任何具有该签名的函数都可以用来代替 appHandler。假设您编写了这样一个函数:

func myHandler(http.ResponseWriter, *http.Request) {
// Handle request
}

只要请求 appHandler,您就可以传递此函数。但是,如果不编写如下结构,则无法将 if 传递到需要 Handler 的位置:

type myHandlerStruct struct{}

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

您可以为 appHandler 类型定义一个方法,而不是定义新的结构:

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

现在,您可以将 appHandler 传递到需要 appHandler 的位置以及需要 Handler 的位置。如果将其作为 Handler 进行调用,则 ServeHTTP 方法将简单地将调用转发给底层函数。

关于戈兰;难以理解作为接收者的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102866/

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