将GoLang的http.ResponseWriter功能扩展到处理前/处理后响应

I am trying to write a simple http MiddleWare handler that will process an http response. Unfortunately, it does not work and I cannot figure out what mistake I am making. Any/all help is appreciated!

I am using Go Gorilla mux router Here are illustrative parts of the code:

import (
    "fmt"
    "log"
    "github.com/gorilla/mux"
)
:
func Start() {
    router := mux.NewRouter()
    router.HandleFunc("/", myHandler)
    :
    log.Fatal(http.ListenAndServe(":8088", Middleware(router)))
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "myHandler called")
}
func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        neww := NewProcessor(w)
        h.ServeHTTP(neww, r)
    })
}

type Processor struct {
    http.ResponseWriter
}
func (r *Processor) Write(b []byte) (int, error) {
    fmt.Printf("******* Processor writing...")
    log.Print(string(b)) // log it out
    return r.Write(b)    // pass it to the original ResponseWriter
}
func NewProcessor(w http.ResponseWriter) http.ResponseWriter {
    fmt.Printf("******* Creating new Processor...")
    return &Processor{ResponseWriter: w}
}

The output I get is listed below (extra logging text omitted for clarity):

******* Creating new Processor 
myHandler called

However, notice the message "******* Processor writing..." was not displayed, suggesting that the "Write" function did not get called.

What changes need to be made to allow the "Write" function to be called?

return r.Write(b) caused an infinite loop of calls to the Processor's Write() method. Replacing it with return r.ResponseWriter.Write(b) fixed the bug.

Here is the corrected code:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", myHandler)
    log.Fatal(http.ListenAndServe(":8088", Middleware(mux)))
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "myHandler called")
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        new := NewProcessor(w)
        h.ServeHTTP(new, r)
    })
}

type Processor struct {
    http.ResponseWriter
}

func (r *Processor) Write(b []byte) (int, error) {
    log.Print("******* Processor writing...")
    log.Print(string(b)) // log it out
    return r.ResponseWriter.Write(b)    // pass it to the original ResponseWriter
}

func NewProcessor(w http.ResponseWriter) http.ResponseWriter {
    log.Print("******* Creating new Processor...")
    return &Processor{ResponseWriter: w}
}

Output:

2016/07/21 22:59:08 ******* Creating new Processor...
2016/07/21 22:59:08 ******* Processor writing...
2016/07/21 22:59:08 myHandler called