修饰器

简单的描述:一个修饰器函数,参数是函数,返回一个运行了这个参数函数的跟参数函数保持相同的函数。

如果是接口,那么就是一个修饰器函数,参数是一个接口,返回值还是这个接口。

func D(f func(s string))func(s string){
  return func(s string){
    f(s)
    fmt.Println("done")
  }
}

func main(){
  D(func(s string){
    fmt.Println(s)
  })("hello")
}

具体案例

http 处理 cookie 和 header 的案例:

func main(){
  http.HandleFunc("/",WithHeader(hello))
  http.HandleFunc("/s",WithCookie(hello))
  http.ListenAndServe(":8080",nil)
}

func hello(w http.ResponseWriter,r *http.Request){
  fmt.Fprintln(w,"hello")
}
func WithHeader(h http.HandlerFunc)http.HandlerFunc{
  return func(w http.ResponseWriter,r *http.Request){
    w.Header().Set("Server", "HelloServer")
    h(w,r)
  }
}
  
func WithCookie(h http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		cookie := &http.Cookie{Name: "auth", Value: "123456", Path: "/"}
		http.SetCookie(w, cookie)
		h(w, r)
	}
}

多修饰器的 pipeline (串型调用)

type Hander func(http.HandlerFunc)http.HandlerFunc

func DealWith(h http.HandlerFunc,handlers ...Hander)http.HandlerFunc{
  for i := range handlers {
    d := handlers[len(handlers) -i-1]
    h = d(h) 
  }
  return h
}
func main(){
  http.HandleFunc("/",DealWith(hello,WithCookie,WithHeader))
  http.ListenAndServe(":8080",nil)
}