关于本小节视频调用的一些疑惑
来源:8-3 服务器统一出错处理

慕后端4419857
2021-05-13
老师,您好。
这结课理解起来有点费劲,有几个疑惑的问题。http.HandleFunc("/",errWrapper(filelisting.HandleFileList))
中,filelisting.HandleFileList是 filelisting里的 func HandleFileList
但是 调用的函数func errWrapper(handler appHandler) func( http.ResponseWriter, *http.Request) {...}
中,参数名handler 应该指代的就是 filelisting.HandleFileList吧? 那类型却变成了 appHandler,我有点不明白为什么。
2.关于type 我也有点蒙type appHandler func(writer http.ResponseWriter, request *http.Request) error
它和我下图这么写有什么区别吗?
我的理解是他们都实现了传入 两个参数 writer http.ResponseWriter, request *http.Request 返回一个error的功能,不对吗?
1回答
-
type ...是定义一个类型的意思,并不包含实现。
type appHandler func(writer http.ResponseWriter, request *http.Request) error
这里定义了一个类型,叫做appHandler,这是个函数类型,怎样的函数呢,是具有函数签名(函数签名就是函数参数列表+返回值的类型的意思)func(writer http.ResponseWriter, request *http.Request) error的函数。
这里的filelisting.HandleFileList函数,恰巧符合上述appHandler的签名(具有相同的参数列表和返回值类型),因此它可以被当作appHandler类型使用。
func errWrapper(handler appHandler) func( http.ResponseWriter, *http.Request)
这个errWrapper函数就通过appHandler自定义类型,实现了和业务逻辑HandleFileList的解藕。它可以去包装(就是Wrap的意思)HandleFileList,也可以去包装其他函数,只要它们满足appHandler的签名要求。这样我们就实现了一个业务逻辑无关的统一出错处理机制。
而
fun appHandler(writer http.ResponseWriter, request *http.Request) error
只是定义了一个名叫appHandler的函数。接下来应该使用{ ... }来实现它。
112021-05-16
相似问题