feat: Dont make copies of structs for validation #665
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a small problem with validation implementation:
Current implementation uses
dst.Interface()
which returns a value(T
), not a pointer(*T
) of a structT
. This can be a performance hit on bigger structures as compiler would have to partially copy the structT
. And since validation is performed on each structure, the whole thing would be copied at least N times (where N is the structure depth).Passing by value also does not play nicely with other (non-reflection based) validation libraries, such as
github.com/go-ozzo/ozzo-validation
, since validating a structure there can require a method call, which is not possible. Converting aninterface{}
with value is not an option also -reflect.Value.Addr()
is prohibited forValue
s, created viareflect.ValueOf(v)
.