Golang中實現禁止拷貝
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() {}
然後把noCopy
嵌到你自定義的結構體裡,然後go vet
就可以幫我們進行檢查了。舉個例子:
package main import ( "fmt" ) type noCopy struct{} func (*noCopy) Lock(){} func (*noCopy) Unlock() {} type Demo struct { noCopy noCopy } func Copy(d Demo) { CopyTwice(d) } func CopyTwice(d Demo) {} func main() { d := Demo{} fmt.Printf("%+v", d) Copy(d) fmt.Printf("%+v", d) }
執行一下:
$ go vet main.go # command-line-arguments ./main.go:16: Copy passes lock by value: main.Demo contains main.noCopy ./main.go:17: call of CopyTwice copies lock value: main.Demo contains main.noCopy ./main.go:19: CopyTwice passes lock by value: main.Demo contains main.noCopy ./main.go:23: call of fmt.Printf copies lock value: main.Demo contains main.noCopy ./main.go:25: call of Copy copies lock value: main.Demo contains main.noCopy ./main.go:27: call of fmt.Printf copies lock value: main.Demo contains main.noCopy