关于本小节视频调用的一些疑惑

来源: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回答

ccmouse

2021-05-15

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的函数。接下来应该使用{ ... }来实现它。

1
1
慕后端4419857
非常感谢!
2021-05-16
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程