diff --git a/helper/shadow/closer.go b/helper/shadow/closer.go index 7edd5e75d..edc1e2a93 100644 --- a/helper/shadow/closer.go +++ b/helper/shadow/closer.go @@ -39,6 +39,8 @@ func (w *closeWalker) Struct(reflect.Value) error { return nil } +var closerType = reflect.TypeOf((*io.Closer)(nil)).Elem() + func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error { // Not sure why this would be but lets avoid some panics if !v.IsValid() { @@ -56,17 +58,18 @@ func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error return nil } - // We're looking for an io.Closer - raw := v.Interface() - if raw == nil { - return nil + var closer io.Closer + if v.Type().Implements(closerType) { + closer = v.Interface().(io.Closer) + } else if v.CanAddr() { + // The Close method may require a pointer receiver, but we only have a value. + v := v.Addr() + if v.Type().Implements(closerType) { + closer = v.Interface().(io.Closer) + } } - closer, ok := raw.(io.Closer) - if !ok && v.CanAddr() { - closer, ok = v.Addr().Interface().(io.Closer) - } - if !ok { + if closer == nil { return reflectwalk.SkipEntry }