```go
func middleware(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Executing middleware before request phase!")
// Pass control back to the handler
//handler.ServeHTTP(w, r)
fmt.Println("Executing middleware after response phase!")
})
}
```
看到上面的代码有一个疑问
HandlerFunc 函数接收两个参数调,上面的代码调用HandlerFunc 函数传递的是一个匿名函数。HandlerFunc 函数声明源码如下:
type HandlerFunc func(ResponseWriter, *Request)
```
f := func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Executing middleware before request phase!")
// Pass control back to the handler
//handler.ServeHTTP(w, r)
fmt.Println("Executing middleware after response phase!")
}
type HF http.HandlerFunc
return HF ( f )
```
#3
更多评论
这里并不是函数调用,而是类型转换。
`type HandlerFunc func(ResponseWriter, *Request)` 表明 HandlerFunc 是一个类型。
这里的匿名函数符合这个类型,转强制类型转换。
而 HandlerFunc 实现了 http.Handler 接口,所以,可以直接返回该类型。
#1
楼上说的是对的。你可以转换一下思维,比如把 http.HandlerFunc 看成 int,把 func(w ,r) 看成一个变量 a,实际上这就是个强制类型转换。
#2