我是Go的新手,但遇到以下问题。我试图简化它:我有一台服务器,例如,它具有一个全局变量myvar。所有用户都可以发布端点/step1,并将一些数据保存在变量中,可以使用第二个端点通过GET检索该数据/step2。在这两个调用之间myvar,该用户的值不应更改。
myvar
/step1
/step2
我想知道是否有一种方法可以为每个用户实例化此过程,因为我需要一个用户更改变量,而不会影响其他用户。我不一定需要使用全局变量,它只是公开我要对端点执行的操作。
码:
package main import ( "encoding/json" "net/http" "github.com/gorilla/mux" "github.com/rs/cors" "fmt" ) type Test struct { test string `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: []string{"*"}, AllowCredentials: true, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "PATCH"}, AllowedHeaders: []string{"*"}, ExposedHeaders: []string{"*"}, }) handler := c.Handler(router) http.ListenAndServe(":8003", handler) }
同时从多个goroutine服务请求。这意味着,如果他们读/写相同的变量,则必须同步访问该变量。
接下来,如果要为每个用户使用此数据的不同实例,则可以使用映射,从用户ID或名称映射到数据结构。
假设数据结构是一个结构,例如:
type customData struct { Field1 string Field2 int // Whatever fields you need }
每个用户持有一张的地图:
var userDataMap = map[string]customData{}
sync.RWMutex从goroutine读取/写入地图时,您可以使用来保护地图:
sync.RWMutex
var mu = &sync.RWMutex{}
并使用上述互斥锁同步访问地图:
func Get(user string) customData { mu.RLock() defer mu.RUnlock() return userDataMap[user] } func Set(user string, data customData) { mu.Lock() userDataMap[user] = data mu.Unlock() }
另一个更复杂的解决方案是使用服务器端HTTP会话。