@@ -34,6 +34,7 @@ type RowScanner struct {
3434 started bool
3535 scanFn func (dstVal reflect.Value ) error
3636 start startScannerFunc
37+ scans []interface {}
3738}
3839
3940// NewRowScanner is a package-level helper function that uses the DefaultAPI object.
@@ -130,13 +131,15 @@ func (*noOpScanType) Scan(value interface{}) error {
130131}
131132
132133func (rs * RowScanner ) scanStruct (structValue reflect.Value ) error {
133- scans := make ([]interface {}, len (rs .columns ))
134+ if rs .scans == nil {
135+ rs .scans = make ([]interface {}, len (rs .columns ))
136+ }
134137 for i , column := range rs .columns {
135138 fieldIndex , ok := rs .columnToFieldIndex [column ]
136139 if ! ok {
137140 if rs .api .allowUnknownColumns {
138141 var tmp noOpScanType
139- scans [i ] = & tmp
142+ rs . scans [i ] = & tmp
140143 continue
141144 }
142145 return fmt .Errorf (
@@ -150,9 +153,9 @@ func (rs *RowScanner) scanStruct(structValue reflect.Value) error {
150153 initializeNested (structValue , fieldIndex )
151154
152155 fieldVal := structValue .FieldByIndex (fieldIndex )
153- scans [i ] = fieldVal .Addr ().Interface ()
156+ rs . scans [i ] = fieldVal .Addr ().Interface ()
154157 }
155- if err := rs .rows .Scan (scans ... ); err != nil {
158+ if err := rs .rows .Scan (rs . scans ... ); err != nil {
156159 return fmt .Errorf ("scany: scan row into struct fields: %w" , err )
157160 }
158161 return nil
@@ -163,14 +166,16 @@ func (rs *RowScanner) scanMap(mapValue reflect.Value) error {
163166 mapValue .Set (reflect .MakeMap (mapValue .Type ()))
164167 }
165168
166- scans := make ([]interface {}, len (rs .columns ))
169+ if rs .scans == nil {
170+ rs .scans = make ([]interface {}, len (rs .columns ))
171+ }
167172 values := make ([]reflect.Value , len (rs .columns ))
168173 for i := range rs .columns {
169174 valuePtr := reflect .New (rs .mapElementType )
170- scans [i ] = valuePtr .Interface ()
175+ rs . scans [i ] = valuePtr .Interface ()
171176 values [i ] = valuePtr .Elem ()
172177 }
173- if err := rs .rows .Scan (scans ... ); err != nil {
178+ if err := rs .rows .Scan (rs . scans ... ); err != nil {
174179 return fmt .Errorf ("scany: scan rows into map: %w" , err )
175180 }
176181 // We can't set reflect values into destination map before scanning them,
@@ -185,7 +190,11 @@ func (rs *RowScanner) scanMap(mapValue reflect.Value) error {
185190}
186191
187192func (rs * RowScanner ) scanPrimitive (value reflect.Value ) error {
188- if err := rs .rows .Scan (value .Addr ().Interface ()); err != nil {
193+ if rs .scans == nil {
194+ rs .scans = make ([]interface {}, 1 )
195+ }
196+ rs .scans [0 ] = value .Addr ().Interface ()
197+ if err := rs .rows .Scan (rs .scans ... ); err != nil {
189198 return fmt .Errorf ("scany: scan row value into a primitive type: %w" , err )
190199 }
191200 return nil
0 commit comments