common/nocopy.go (15 lines of code) (raw):
package common
import "errors"
// The NoCopy struct is used as a field inside another struct that should not be copied by value.
// After embedded this field, the out struct's members can call the Check method which will panic
// if it detects the out struct has been copied by value.
type NoCopy struct {
nocopy *NoCopy
}
// Check panics if the struct embedded this NoCopy field has been copied by value.
func (nc *NoCopy) Check() {
if nc.nocopy == nc {
return // The reference matches the 1st-time reference
}
if nc.nocopy == nil { // The reference was never set, set it
nc.nocopy = nc
return
}
// The receiver's reference doesn't match the persisted reference; this must be a copy
panic(errors.New("nocopy detected copy by value"))
}