当您的处理程序需要一个变量时,通常意味着您应该实现Handler接口而不是提供HandlerFunc函数。


这是一个不好的例子(使用全局变量):


var globalThing string


func specificHandler(w http.ResponseWriter, r *http.Request) {

    w.Write(globalConfigThing)

}


func main() {

    globalThing = "Hello world!"

    http.HandleFunc("/something", specificHandler)

    http.ListenAndServe(":8080", nil)

}

这是一个更好的例子(不使用全局变量):


type specificHandler struct {

    Thing string

}


func (h *specificHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    w.Write(h.Thing)

}


func main() {

    http.Handle("/something", &specificHandler{Thing: "Hello world!"})

    http.ListenAndServe(":8080", nil)

}

如您所见,aHandler可以封装变量。


为了完整性,另一种方法是使用函数闭包。这适用于一次性处理程序,但不可重用,并且更难为其编写单元测试。


func main() {

    scopedThing := "Hello world!"

    http.HandleFunc("/something", func (w http.ResponseWriter, r *http.Request) {

        w.Write(scopedThing)

    })

    http.ListenAndServe(":8080", nil)

}

正确完成后,您现在可以somepackage通过将全局变量作为参数等传递来避免包中的全局变量。



type specificHandler struct {

    QueueA somepackage.PriorityQueueAStar

    QueueB somepackage.PriorityQueueAStar

    QueueC somepackage.PriorityQueueAStar

}


func (h *specificHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    h.QueueA.Push(h.QueueB.Pop)

    h.QueueB.Push(h.QueueC.Pop)

    w.Write([]byte("Queues pushed and popped"))

}