2016-04-28 4 views
3

Ich bin ein kleines Webserver-Programm zu schreiben, und es hat eine Menge von JSON Dekodierung von Anfragen POST kommt in.Ist es immer in Ordnung, Variablen gleichzeitig in Go zu verwenden?

Anfänge dachte ich, dass statt ein neues json.Decoder eine Anforderung kommt jedes Mal initialisiert, ich habe es als eine globale Variable, die jedes Mal aufgerufen wird und gleichzeitig mit den Goroutines dekodiert.

Als Neuling in Go, ist das okay? Gibt es Zeiten, in denen ich das nicht tun sollte und die Klassen ausflippen werden, weil sie nicht threadsicher sind (ich denke, dass "Goroutine" sicher besser wäre)?

+6

Es ist nicht klar, was Sie mit 'json.Decoder' bedeuten - wie würden Sie wieder verwenden einen, da es keine ist Möglichkeit, ihren io.Reader zu ändern? Aber nein, meistens können Sie keine go-Objekte gleichzeitig verwenden, es sei denn, sie sind nachweislich sicher für die gleichzeitige Verwendung. –

+0

Ah genug, ich habe nicht einmal so weit voraus gedacht. –

Antwort

6

In Go verwendet json.NewDecoder einen io.Reader als Eingabeparameter und gibt einen * json.Decoder zurück. Daher ist es nicht möglich, den gleichen Decoder zu verwenden, da wir für jede POST-Anfrage ein anderes http.Request.Body (welches io.Reader implementiert) haben.

Und wie von Paul Hankin erwähnt, können Sie keine go-Objekte gleichzeitig verwenden, außer wenn dokumentiert ist, dass sie gleichzeitig sicher zu verwenden sind.

Beispiele:

  1. http.Client & http.Transport

    Clients und Transporte sind sicher für gleichzeitige Nutzung durch mehrere goroutines und Effizienz sollte nur einmal erstellt werden und re- benutzt.

Source

  1. Karten

    Nach langer Diskussion wurde beschlossen, dass die typische Verwendung von Karten nicht sicheren Zugang von mehreren erforderte Gorousinen.

Source

Wenn Sie gefragt, über JSON-Decoder Wiederverwendung der Duplizierung von Code vermeiden Sie Frameworks wie Tigertonic und Go-Json-Rest aussehen könnte.

Auf einer Seitennotiz können Sie ffjson betrachten, um JSON Decoding zu beschleunigen.

2

Wie John und Paul gesagt haben, wird dies nicht tun, was Sie erwarten.

Wenn Ihr Hauptanliegen Code-Duplizierung ist, was Sie wahrscheinlich wollen, ist eine Middleware. Hier ist ein Beispiel dafür, wie man tun könnte es

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

(der auf Spielplatz: https://play.golang.org/p/4ZTaQguNj7)

Verwandte Themen