2016-04-28 49 views
3

我正在寫一個小的網絡服務器程序,它從POST請求了很多JSON解碼的到來。在Go中同時使用變量總是可以的嗎?

起初我認爲不是一個請求到達一個新的json.Decoder每次初始化,我把它當作一個全局變量,每次被調用並與goroutine同時解碼。

作爲Go的新手,這可以嗎?有時候我不應該這樣做,並且課程會因爲不是線程安全而出現異常(我猜「goroutine」安全會更好)?

+6

目前尚不清楚你的意思'json.Decoder'什麼 - 你將如何重新使用一個,因爲沒有如何改變他們的io.Reader?但是,不,大多數情況下,您不能同時使用go對象,除非它們被記錄爲可以安全地同時使用。 –

+0

啊,夠公平的,我甚至都沒有想到那麼遠。 –

回答

6

在Go中,json.NewDecoder將io.Reader作爲輸入參數並返回一個* json.Decoder。因此,不可能重複使用相同的解碼器,因爲每個POST請求都有不同的http.Request.Body(它實現io.Reader)。

正如Paul Hankin所述,除非他們被記錄爲可安全地同時使用,否則不能同時使用go對象。

例子:

  1. http.Client & http.Transport

    客戶端和傳輸是安全的 多個夠程同時使用和效率應該只 創建一次,重新用過的。

Source

  • 地圖

    長時間的討論後,決定將一般使用的地圖並不需要從多個安全訪問夠程。

  • Source

    如果你問重複使用JSON解碼器,以避免重複代碼,你可以看看像TigertonicGo-Json-Rest框架。

    在附註中,您可以看看ffjson以加速JSON解碼。

    2

    就像約翰和保羅說的,這不會做你期望的。

    如果您主要關心的是代碼重複,您可能需要的是中間件。這裏是你如何能做到這一點

    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)) 
        ... 
    } 
    

    (操場:https://play.golang.org/p/4ZTaQguNj7)爲例

    相關問題