代码之家  ›  专栏  ›  技术社区  ›  TomSawyer

在包级别声明互斥变量是好的做法吗?[封闭]

  •  -4
  • TomSawyer  · 技术社区  · 7 年前

    在一个包中,我声明了一些变量和一个互斥变量。 我想用它来锁定或解锁包级别变量的get/set。

    var mutex sync.Mutex
    var tplPath = ""
    
    func Prepare(c *gin.Context) {
        mutex.Lock()
        tplPath = "abc"
        mutex.Unlock()
    }
    

    当使用互斥锁可以防止并发http请求中tplpath上get/set的竞争条件时,这是否是一个好的实践?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Zak    7 年前

    使用包级变量并不总是好的或总是坏的。视问题而定。

    关于这个特定的代码示例,唯一的一点是您可能会在代码中的多个位置锁定和解锁。

    如果你选择走这条路,这是好的,考虑提取 tplPath mutex 成为一种。

    // create type and expose values through getters and setters 
    // to ensure the mutex logic is encapsulated.
    type path struct {
        mu sync.Mutex
        val string
    }
    
    func (p *path) setPath(path string) {
        p.mu.Lock()
        defer p.mu.Unlock()
        p.val = path
    }
    
    func (p *path) path() string {
        p.mu.Lock()
        defer p.mu.Unlock()
        return p.val
    }
    
    var tplPath *path
    
    func init() {
        // use package init to make sure path is always instantiated
        tplPath = new(path)
    }
    
    func Prepare(c *gin.Context) {
        tplPath.setPath("abc")
    }