reset.go raw

   1  // Copyright 2019 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package proto
   6  
   7  import (
   8  	"fmt"
   9  
  10  	"google.golang.org/protobuf/reflect/protoreflect"
  11  )
  12  
  13  // Reset clears every field in the message.
  14  // The resulting message shares no observable memory with its previous state
  15  // other than the memory for the message itself.
  16  func Reset(m Message) {
  17  	if mr, ok := m.(interface{ Reset() }); ok && hasProtoMethods {
  18  		mr.Reset()
  19  		return
  20  	}
  21  	resetMessage(m.ProtoReflect())
  22  }
  23  
  24  func resetMessage(m protoreflect.Message) {
  25  	if !m.IsValid() {
  26  		panic(fmt.Sprintf("cannot reset invalid %v message", m.Descriptor().FullName()))
  27  	}
  28  
  29  	// Clear all known fields.
  30  	fds := m.Descriptor().Fields()
  31  	for i := 0; i < fds.Len(); i++ {
  32  		m.Clear(fds.Get(i))
  33  	}
  34  
  35  	// Clear extension fields.
  36  	m.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
  37  		m.Clear(fd)
  38  		return true
  39  	})
  40  
  41  	// Clear unknown fields.
  42  	m.SetUnknown(nil)
  43  }
  44