reflect: in assignTo only allocate target if needed Also correct parameter name in comment. Change-Id: Ic9486e08c2eea184faccf181cda7da808793def6 Reviewed-on: https://go-review.googlesource.com/c/go/+/400674 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Dan Kortschak <dan@kortschak.io> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Joseph Tsai <joetsai@digital-static.net> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/src/reflect/value.go b/src/reflect/value.go index 6fe3cee..de24d4c 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go
@@ -3056,9 +3056,10 @@ return Value{t.ptrTo(), p, fl} } -// assignTo returns a value v that can be assigned directly to typ. -// It panics if v is not assignable to typ. -// For a conversion to an interface type, target is a suggested scratch space to use. +// assignTo returns a value v that can be assigned directly to dst. +// It panics if v is not assignable to dst. +// For a conversion to an interface type, target, if not nil, +// is a suggested scratch space to use. // target must be initialized memory (or nil). func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value { if v.flag&flagMethod != 0 { @@ -3074,9 +3075,6 @@ return Value{dst, v.ptr, fl} case implements(dst, v.typ): - if target == nil { - target = unsafe_New(dst) - } if v.Kind() == Interface && v.IsNil() { // A nil ReadWriter passed to nil Reader is OK, // but using ifaceE2I below will panic. @@ -3084,6 +3082,9 @@ return Value{dst, nil, flag(Interface)} } x := valueInterface(v, false) + if target == nil { + target = unsafe_New(dst) + } if dst.NumMethod() == 0 { *(*any)(target) = x } else {