Go 具有多个用户的服务器实例
我是新手,我有以下问题。我试图简化它: 我有一个服务器,它有一个全局变量myvar。所有用户都可以发布endpoint/step1并在变量中保存一些数据,可以使用第二个endpoint/step2通过GET检索这些数据。在这两次调用之间,该用户的myvar值不应更改 我想知道是否有一种方法可以为每个用户实例化这个过程,因为我需要的是,如果一个用户更改变量,它不会影响其他用户。我不一定需要使用全局变量,它只是公开我想要对端点执行的操作 代码:Go 具有多个用户的服务器实例,go,concurrency,server,Go,Concurrency,Server,我是新手,我有以下问题。我试图简化它: 我有一个服务器,它有一个全局变量myvar。所有用户都可以发布endpoint/step1并在变量中保存一些数据,可以使用第二个endpoint/step2通过GET检索这些数据。在这两次调用之间,该用户的myvar值不应更改 我想知道是否有一种方法可以为每个用户实例化这个过程,因为我需要的是,如果一个用户更改变量,它不会影响其他用户。我不一定需要使用全局变量,它只是公开我想要对端点执行的操作 代码: 同时从多个goroutine提供请求。这意味着,如果它
同时从多个goroutine提供请求。这意味着,如果它们读取/写入相同的变量,则必须同步对此变量的访问 接下来,如果您想为每个用户提供此数据的不同实例,可以使用映射,从用户ID或名称映射到数据结构 假设数据结构是一个struct,例如:
type customData struct {
Field1 string
Field2 int
// Whatever fields you need
}
为每个用户保存一个的地图:
var userDataMap = map[string]customData{}
当从goroutine读取/写入地图时,您可以使用来保护地图:
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会话。有关详细信息,请参见谢谢您的回答,我会继续努力,然后回来与您联系feedback@Battalgazi我编辑了代码并将customData指针更改为非指针。如果您尝试修改并设置相同的*customData值,这可能会阻止进一步的数据竞争。谢谢,我可以按照您的建议使用映射使其工作:
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()
}