Go 具有多个用户的服务器实例

Go 具有多个用户的服务器实例,go,concurrency,server,Go,Concurrency,Server,我是新手,我有以下问题。我试图简化它: 我有一个服务器,它有一个全局变量myvar。所有用户都可以发布endpoint/step1并在变量中保存一些数据,可以使用第二个endpoint/step2通过GET检索这些数据。在这两次调用之间,该用户的myvar值不应更改 我想知道是否有一种方法可以为每个用户实例化这个过程,因为我需要的是,如果一个用户更改变量,它不会影响其他用户。我不一定需要使用全局变量,它只是公开我想要对端点执行的操作 代码: 同时从多个goroutine提供请求。这意味着,如果它

我是新手,我有以下问题。我试图简化它: 我有一个服务器,它有一个全局变量myvar。所有用户都可以发布endpoint/step1并在变量中保存一些数据,可以使用第二个endpoint/step2通过GET检索这些数据。在这两次调用之间,该用户的myvar值不应更改

我想知道是否有一种方法可以为每个用户实例化这个过程,因为我需要的是,如果一个用户更改变量,它不会影响其他用户。我不一定需要使用全局变量,它只是公开我想要对端点执行的操作

代码:


同时从多个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()
}