亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Golang 中將全局變量與 Http 處理程序一起使用

在 Golang 中將全局變量與 Http 處理程序一起使用

Go
翻閱古今 2022-01-04 21:13:52
我知道有一些關于這個問題的問題和帖子/文章,但從我新手的角度來看,并不完全如此。問題是,我有一個主程序監聽端口并將調用重定向到特定的處理程序。典型結構:func main() {    http.HandleFunc("/something", specificHandler)    http.ListenAndServe(":8080", nil)}處理程序類似于:func specificHandler(w http.ResponseWriter, r *http.Request) {    somepackage.foo()}然后somepackage,其中包含函數foo,有一些全局變量,基本上是因為函數需要共享它們(例如,當使用由容器/堆實現的優先級隊列時,它將從 Swap 函數中獲取優先級全局距離矩陣,當然是可變的)。以及許多其他例子??傊?,全局變量...問題是,正如您可能看到的,這些變量在對處理程序的所有調用之間共享。這很糟糕。我怎樣才能真正解決這個問題?必須有一種簡單的方法來做到這一點,我還沒有,因為它看起來很平常......提前致謝。
查看完整描述

1 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

當您的處理程序需要一個變量時,通常意味著您應該實現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通過將全局變量作為參數等傳遞來避免包中的全局變量。


編輯:例如,您可以使用包中的幾個PriorityQueueAStar字段定義處理程序結構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"))

}


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號