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() {}

使用案例

image

posted @ 2023-12-26 17:11  LdreamerD  阅读(30)  评论(0)    收藏  举报