我正在寫一個小的網絡服務器程序,它從POST請求了很多JSON解碼的到來。在Go中同時使用變量總是可以的嗎?
起初我認爲不是一個請求到達一個新的json.Decoder
每次初始化,我把它當作一個全局變量,每次被調用並與goroutine同時解碼。
作爲Go的新手,這可以嗎?有時候我不應該這樣做,並且課程會因爲不是線程安全而出現異常(我猜「goroutine」安全會更好)?
我正在寫一個小的網絡服務器程序,它從POST請求了很多JSON解碼的到來。在Go中同時使用變量總是可以的嗎?
起初我認爲不是一個請求到達一個新的json.Decoder
每次初始化,我把它當作一個全局變量,每次被調用並與goroutine同時解碼。
作爲Go的新手,這可以嗎?有時候我不應該這樣做,並且課程會因爲不是線程安全而出現異常(我猜「goroutine」安全會更好)?
在Go中,json.NewDecoder將io.Reader作爲輸入參數並返回一個* json.Decoder。因此,不可能重複使用相同的解碼器,因爲每個POST請求都有不同的http.Request.Body(它實現io.Reader)。
正如Paul Hankin所述,除非他們被記錄爲可安全地同時使用,否則不能同時使用go對象。
例子:
http.Client & http.Transport
客戶端和傳輸是安全的 多個夠程同時使用和效率應該只 創建一次,重新用過的。
地圖
長時間的討論後,決定將一般使用的地圖並不需要從多個安全訪問夠程。
如果你問重複使用JSON解碼器,以避免重複代碼,你可以看看像Tigertonic和Go-Json-Rest框架。
在附註中,您可以看看ffjson以加速JSON解碼。
就像約翰和保羅說的,這不會做你期望的。
如果您主要關心的是代碼重複,您可能需要的是中間件。這裏是你如何能做到這一點
type JSONHandler func(http.ResponseWriter, *http.Request, *json.Decoder)
func JSONMiddleware(handler JSONHandler) http.HandlerFunc{
return func(w http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(req.Body)
handler(w, req, decoder)
}
}
func MyHandler(w http.ResponseWriter, req *http.Request, decoder *json.Decoder) {
// Put your code here, you have access to the decoder
}
func main() {
http.HandleFunc("/myroute", JSONMiddleware(MyHandler))
...
}
目前尚不清楚你的意思'json.Decoder'什麼 - 你將如何重新使用一個,因爲沒有如何改變他們的io.Reader?但是,不,大多數情況下,您不能同時使用go對象,除非它們被記錄爲可以安全地同時使用。 –
啊,夠公平的,我甚至都沒有想到那麼遠。 –