noCopy相关错误
func main() {
var mu sync.Mutex
var i int
// mu 重新拷贝出来一个
m := mu
m.Lock()
i += 1
m.Unlock()
}
➜ locktest git:(master) ✗ go vet ./...
# example/locktest
./test_lock.go:9:7: assignment copies lock value to m: sync.Mutex
划重点:变量资源本身带状态且操作要配套的不能拷贝。
比如Mutex锁, waitgroup 这些本身都是带状态的信息的. 并且它们操作一定要配套, 不然就会死锁.
mu.Lock()
mu.Unlock()
wg.Add(1)
wg.Done(1)
死锁的示例:
func main() {
var mu sync.Mutex
var i int
// 第一次加锁放锁
mu.Lock()
//...
// 不知道为啥拷出来
m := mu
i += 1
m.Unlock()
// 第二次加锁放锁
mu.Lock()
i += 1
mu.Unlock()
}
type Obj struct {
mu sync.Mutex
// ... 其他字段
}
func (o Obj) Lock() { o.mu.Lock() }
func (o Obj) Dosomething() {}
func (o Obj) Unlock() { o.mu.Unlock() }
func main() {
o := Obj{}
o.Lock()
o.Dosomething()
o.Unlock()
o.Lock()
o.Dosomething()
o.Unlock()
}
func doSomething(wg sync.WaitGroup) {
defer wg.Done()
// ...
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
doSomething(wg)
wg.Wait()
}
划重点:针对需要配套操作的变量类型,基本上都会要求 noCopy 的,否则拷贝出来就乱套了。
发表回复