Instances de serveur avec plusieurs utilisateurs

Je suis nouveau à Go et j’ai le problème suivant. J’ai essayé de le simplifier: j’ai un serveur qui a par exemple une variable globale myvar . Tous les utilisateurs peuvent POST le noeud final /step1 et enregistrer certaines données dans la variable, qui peuvent être récupérées avec un GET en utilisant le deuxième noeud final /step2 . Entre ces 2 appels, la valeur de myvar ne doit pas changer pour cet utilisateur.

J’aimerais savoir s’il existe un moyen d’instancier ce processus pour chaque utilisateur, car si un utilisateur modifie la variable, cela n’a pas d’incidence sur les autres utilisateurs. Je n’ai pas nécessairement besoin d’utiliser la variable globale, c’est juste pour exposer ce que je veux faire avec les points de terminaison.

Code:

 package main import ( "encoding/json" "net/http" "github.com/gorilla/mux" "github.com/rs/cors" "fmt" ) type Test struct { test ssortingng `json:"test,omitempty"` } func main() { var myvar = "test" router := mux.NewRouter() router.HandleFunc("/step1", func(w http.ResponseWriter, r *http.Request) { var test Test _ = json.NewDecoder(r.Body).Decode(&test) myvar = test.test }) router.HandleFunc("/step2", func(w http.ResponseWriter, r *http.Request) { fmt.Println(myvar) }) c := cors.New(cors.Options{ AllowedOrigins: []ssortingng{"*"}, AllowCredentials: true, AllowedMethods: []ssortingng{"GET", "POST", "PUT", "DELETE", "PATCH"}, AllowedHeaders: []ssortingng{"*"}, ExposedHeaders: []ssortingng{"*"}, }) handler := c.Handler(router) http.ListenAndServe(":8003", handler) } 

Les demandes sont servies à partir de plusieurs goroutines, simultanément. Cela signifie que s’ils lisent / écrivent la même variable, l’access à cette variable doit être synchronisé.

Ensuite, si vous voulez une instance différente de ces données pour chaque utilisateur, vous pouvez utiliser une carte, un mappage de l’ID utilisateur ou du nom à la structure de données.

Supposons que la structure de données est une structure, par exemple:

 type customData struct { Field1 ssortingng Field2 int // Whatever fields you need } 

La carte en tenant un pour chaque utilisateur:

 var userDataMap = map[ssortingng]customData{} 

Vous pouvez utiliser un sync.RWMutex pour protéger une carte lorsqu’elle est lue / écrite depuis une goroutine:

 var mux = &sync.RWMutex{} 

Et synchronisé l’access à la carte, en utilisant le mutex ci-dessus:

 func Get(user ssortingng) customData { mux.RLock() defer mux.RUnlock() return userDataMap[user] } func Set(user ssortingng, data customData) { mux.Lock() userDataMap[user] = data mux.Unlock() } 

Une autre solution plus sophistiquée consisterait à utiliser des sessions HTTP côté serveur. Pour plus de détails, voir Variables de session Go?