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

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结构体?如果是要怎么修改?

阅读 4.8k
1 个回答

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

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

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

var wxMutex sync.Mutex
var wx Wx
// 这是接口入口函数
func Login(c *gin.Context) {
    wxMutex.Lock()
    wx.code = "some code"
    wxMutex.Unlock()
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题