gin中接口外面定义的结构体是线程安全的吗?

发布于 2022-09-11 21:00:13 字数 385 浏览 11 评论 0

type Wx struct {
    Public
    Third
    scope      string
    httpType   string
    state      string
    code       string
    openid     string
    isThird    bool
    grant_type string
}

var wx Wx
// 这是接口入口函数
func Login(c *gin.Context) {
    wx.code = "some code"
}

像这样的结构,如果有个同文件函数也在往wx里赋值属性,那么在当前这个请求中结构体wx是安全的吗?会不会导致线程中的请求修改的同一个Wx结构体?如果是要怎么修改?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兔小萌 2022-09-18 21:00:13

这么定义的变量wx是全局变量,在整个包级别共享。当有多个goroutine去修改的时候不是线程安全的。

在极端情况下,一个goroutine对变量的修改时另外一个变量读取会导致读取到的是旧值。

解决方法很简单,加锁。定义一个包级别锁,对wx修改时加锁。

var wxMutex sync.Mutex
var wx Wx
// 这是接口入口函数
func Login(c *gin.Context) {
    wxMutex.Lock()
    wx.code = "some code"
    wxMutex.Unlock()
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文