关于参数问题
来源:8-3 服务器统一出错处理

慕移动9586716
2021-07-18
老师您好!在这一小节中,函数中有形参,但是你在调用函数的时候并没有给出具体的实参,(例如:writer和request,我们只知道他的类型)这个是为什么呢?
//函数的定义
func errwarappler(handler Apphandle) func(http.ResponseWriter, *http.Request) {
return func(writer http.ResponseWriter, request *http.Request) {
//匿名函数func(http.ResponseWriter,*http.Request)内部构造:
err := handler(writer, request)
if err != nil{
log.Printf("Error handle request:%s", err.Error())
code := http.StatusOK
switch{
case os.IsNotExist(err): //情况一:文件不存在
code = http.StatusNotFound
case os.IsPermission(err): //情况二:没有权限
code = http.StatusForbidden
default:
code = http.StatusInternalServerError
}
http.Error(writer, http.StatusText(code), code)
}
}
}
main()函数:
func main() {
//没有给出具体的的writer和request的值
http.HandleFunc("/kuang/",errwarappler(handle.Handler))
err := http.ListenAndServe(":666", nil)
if err != nil{
panic(err)
}
}
写回答
1回答
-
ccmouse
2021-07-18
这是函数式编程的常用方法。函数只有在调用的时候才需要给出实参。
http.HandleFunc("/kuang/",errwarappler(handle.Handler))
这句代码涉及3个函数:
我们没有调用handle.Handler,只是把handle.Handler函数作为一个参数传递给了errwarappler函数。函数式编程中,函数也能作为参数。区分是调用函数,还是只是一个参数,就取决于有没有括号。handle.Handler后面没有括号,所以是errwarappler的参数。
errwarappler函数被调用,参数(实参)是handle.Handler函数,返回值是func(writer http.ResponseWriter, request *http.Request)这个无名函数,同样,这个返回的函数后面没有括号,因此这个返回的函数是http.HandleFunc的实参。
这个返回的函数调用的时机在请求到达服务器的时候,http库会根据请求制作出实参writer和request,像回调函数那样传递给http.HandleFunc所指定的函数。
再抽象一些描述,整段代码我们把handle.Handler函数用errwarappler包装了一下,制作出了一个新的函数,用这个新的函数来注册进系统,处理/kuang/请求。只有当请求真正收到的时候,我们这个“新的函数”才会被调用。
00
相似问题