go中的copy,一般習慣來講都是值拷貝,但是這種拷貝存在的問題是鎖對象的“失效”,Go中沒有原生的禁止拷貝的方式,所以如果有的結構體,你希望使用者無法拷貝,只能指針傳遞保證全局唯一的話,可以這么干,定義 一個結構體叫 noCopy
,要實現 sync.Locker
這個接口[我也是看鎖的源碼 里面多次用到]
// noCopy may be embedded into structs which must not be copied // after the first use. // // See https://golang.org/issues/8005#issuecomment-190753527 // for details. type noCopy struct{} // Lock is a no-op used by -copylocks checker from `go vet`. func (*noCopy) Lock() {} func (*noCopy) Unlock() {}
demo:
package main import ( "fmt" ) type noCopy struct{} // Lock is a no-op used by -copylocks checker from `go vet`. func (*noCopy) Lock() {} func (*noCopy) Unlock() {} type S struct { noCopy data int } func main() { var s S s.data = 10 ss := s fmt.Println(ss) }