go中全局变量赋值踩坑

  • Result: 使用gin开发web应用出现串用户信息的问题

这个问题不是gin的问题,而是在使用go的时候混淆了概念。

使用gin开发web应用的时候,使用辅助类的函数封装获取当前登录的用户信息。结果因为使用的时候过于不节制,各种方法调用后形成了循环调用,导致程序在编译的时候就无法通过。为了解决这个问题,放弃使用辅助函数来保存用户信息,而是选择使用了一个全局变量来记录当前登录。

问题就出现在全局变量上,变量始终在同一个地址上,每一次用户的请求都会刷新这个登录的信息。而后在并发量上来后,A用户刷了用户信息,进入下一步,B用户刷了信息,A用户获取用户信息,获取到了B用户的信息。导致了用户数据串用。

发现这个问题后一下子无法想到是这里出现异常了,经过调试定位后,发现这个问题。改用上下文传递获取用户信息。

其实这个问题,换个角度来看,我们在使用db的时候,定义了一个全局变量用来保存连接信息,就是为了任意调用。而在使用全局变量的时候,值肯定是进行传递。想当然地去使用全局变量传递内容很容易出现这种坑。

有句话很好“不要通过共享内存来通信,而应该通过通信来共享内存

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。