在一个包中,我声明了一些变量和一个互斥变量。 我想用它来锁定或解锁get / set包级变量。
var mutex sync.Mutex
var tplPath = ""
func Prepare(c *gin.Context) {
mutex.Lock()
tplPath = "abc"
mutex.Unlock()
}
使用互斥锁可以在并发http请求中防止tplPath上get / set的竞争条件吗?
答案 0 :(得分:0)
使用包级别变量并不总是好的或总是坏的。视问题而定。
关于这个特定代码示例的唯一问题是,您可能最终处于锁定和解锁代码中多个位置的状态。
如果你选择沿着这条路走;这没关系,请考虑将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")
}