Command protoc-gen-go-copy is a protoc plugin that generates code to copy messages without reflection.
See also examples.
// NOTE: generated methods names are configurable
// the default names use underscores as a means to avoid collision with
// methods or fields generated by protoc-gen-go
// Proto_ShallowCopy copies fields, from v to the receiver, using field getters.
// Note that v is of an arbitrary type, which may implement any number of the
// field getters, which are defined as any methods of the same signature as those
// generated for the receiver type, with a name starting with Get.
func (x *Policy) Proto_ShallowCopy(v interface{}) {
switch v := v.(type) {
case *Policy:
x.Name = v.GetName()
x.Id = v.GetId()
x.Spec = v.GetSpec()
default:
if v, ok := v.(interface{ GetName() string }); ok {
x.Name = v.GetName()
}
if v, ok := v.(interface{ GetId() rune }); ok {
x.Id = v.GetId()
}
if v, ok := v.(interface{ GetSpec() isPolicy_Spec }); ok {
x.Spec = v.GetSpec()
} else {
func() {
if v, ok := v.(interface{ GetDeletePerson() *Policy_DeletePerson }); ok {
var defaultValue *Policy_DeletePerson
if v := v.GetDeletePerson(); v != defaultValue {
x.Spec = &Policy_DeletePerson_{DeletePerson: v}
return
}
}
if v, ok := v.(interface {
GetDefaultPolicyRejectBlocked() *DefaultPolicy_RejectBlocked
}); ok {
var defaultValue *DefaultPolicy_RejectBlocked
if v := v.GetDefaultPolicyRejectBlocked(); v != defaultValue {
x.Spec = &Policy_DefaultPolicyRejectBlocked{DefaultPolicyRejectBlocked: v}
return
}
}
if v, ok := v.(interface{ GetAny() *anypb.Any }); ok {
var defaultValue *anypb.Any
if v := v.GetAny(); v != defaultValue {
x.Spec = &Policy_Any{Any: v}
return
}
}
}()
}
}
}
// Proto_ShallowClone returns a shallow copy of the receiver or nil if it's nil.
func (x *Policy) Proto_ShallowClone() (c *Policy) {
if x != nil {
c = new(Policy)
c.Name = x.Name
c.Id = x.Id
c.Spec = x.Spec
}
return
}
# install the plugin
go install github.com/joeycumines/protoc-gen-go-copy@latest
# example protoc usage based on https://developers.google.com/protocol-buffers/docs/reference/go-generated
protoc --proto_path=src --go_out=out --go_opt=paths=source_relative --go-copy_out=out --go-copy_opt=paths=source_relative foo.proto bar/baz.proto
This plugin generates methods for message types, written to *_copy.pb.go
file(s). This suffix may be configured using
the generated_filename_suffix
option. These files are intended to sit alongside the usual *.pb.go
files (and
*_grpc.pb.go
files, if you're using gRPC).
All standard plugin options are supported. This includes the paths
option (see above example), and others, including
go package overrides.
Additional plugin options may be provided in the
usual
way, using the format --<plugin>_out=<param1>=<value1>,<param2>=<value2>:<output_directory>
. For example,
--go-copy_out=shallow_copy_method=,shallow_clone_method=:out
would have the effect of deleting any existing source code, that was generated
using this plugin.
Option | Description |
---|---|
generated_filename_suffix | filename suffix for all generated files, defaults to _copy.pb.go |
shallow_copy_method | method name generated for all message types unless set to an empty string, defaults to Proto_ShallowCopy |
shallow_clone_method | method name generated for all message types unless set to an empty string, defaults to Proto_ShallowClone |
- As the (
protoc-gen-go
) generated getters don't support field presence (e.g. returningbool
not*bool
), generated shallow copy methods cannot support, and therefore ignore, optional fields, for sources of a different type to the destination