关于参数问题

来源: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/请求。只有当请求真正收到的时候,我们这个“新的函数”才会被调用。

0
0

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

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

5995 学习 · 1909 问题

查看课程