go vet检测不可复制的类型
不可复制的类型
1 基础类型
sync 包内的所有类型: atomic.Value, sync.Mutex, sync.Cond, sync.RWMutex, sync.Map, sync.Pool, sync.WaitGroup
sync包里有很多注释: must not be copied after first use
2 自定义的struct
原因
比如sync.Mutex,底层是由 state sema 控制的, 当 Mutex 变量被复制时, Mutex 的 state, sema 当时的状态也被复制走了, 但是由于不同 goroutine 之间的 Mutex 已经不是同一个变量了, 这样就会造成要么某个 goroutine 死锁或者不同 goroutine 共享的变量达不到互斥
检测
- go提供了go vet工具来检测出来不可复制的类型是否被复制过
- 目前的 Goland, Vscode 都会集成 go vet 的相关功能, 如果你强迫症比较严重的话, 你就能发现有相关提示
- 一般情况,当 struct 嵌套了 不可复制 类型的变量时, 都需要传递的是 struct 类型变量的指针,可以避免 不可复制类型的 意外复制
- Go 还提供一段 noCopy 的代码, 当你的 struct 有不能被复制的需求的时候, 可以加入以下这段代码,这样就可以利用go vet帮我们检测了!
type noCopy struct{}
// Lock is a no-op used by -copylocks checker from `go vet`.
func (*noCopy) Lock() {}
func (*noCopy) Unlock() {}
使用案例


浙公网安备 33010602011771号