noCopy是什么机制

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 的,否则拷贝出来就乱套了。


已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注