【发布时间】:2020-02-07 23:06:51
【问题描述】:
我正在尝试阅读以下内容:https://blog.golang.org/error-handling-and-go,特别是标题为 Simplifying repetitive error handling 的部分。
他们这样称呼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 接口,因为它实现了ServeHTTP,我明白了。所以它可以在Handle 函数中使用,而viewRecord 不能。
我感到困惑的是viewRecord 和appHandler 和ServeHTTP 之间的关系。哪个调用哪个?他们对“函数如何也可以成为接收器”进行了附加评论,我认为这就是我被绊倒的地方。
在这里,以fn appHandler 作为接收者,我希望像viewRecord.serveHTTP() 这样的东西,但这没有意义,viewRecord 是一个函数。我认为正在发生的事情是Handle 函数调用serveHTTP,但是serveHTTP 如何调用viewRecord?
appHandler(viewRecord) 也做演员吗?
基本上,我正在寻找关于函数成为接收器的含义的一些明确性。我是新手,我想我在这里不小心落在了一个不平凡的地雷上。
【问题讨论】:
-
对于新手:了解这里发生的事情有 2 个先决条件。 1) 阅读OP's first link 中的“简化重复错误处理”部分。 2) 查看 Go 的 net/http 包中的一些源代码,尤其是
HandlerFunc类型和Handler接口,以充分理解链接中的上述部分。
标签: go