reflect/protoreflect: add FieldDescriptor.DefaultEnumValue method

Default values for enums are specified by name, not number. An enum
may contain multiple values with different names but the same number.
Representing the default as a protoreflect.Value containing an EnumNumber
can discard information.

Add a method returning the EnumValueDescriptor.

Change-Id: If8beee3f81d41c4f9af45423252603b86949c7a5
Reviewed-on: https://go-review.googlesource.com/c/145158
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 8e57ebd..ed0d07f 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -497,8 +497,9 @@
 		case protoreflect.BytesKind:
 			g.P("var ", defVarName, " []byte = []byte(", strconv.Quote(string(def.Bytes())), ")")
 		case protoreflect.EnumKind:
+			evalueDesc := field.Desc.DefaultEnumValue()
 			enum := field.EnumType
-			evalue := enum.Values[enum.Desc.Values().ByNumber(def.Enum()).Index()]
+			evalue := enum.Values[evalueDesc.Index()]
 			g.P("const ", defVarName, " ", field.EnumType.GoIdent, " = ", evalue.GoIdent)
 		case protoreflect.FloatKind, protoreflect.DoubleKind:
 			// Floating point numbers need extra handling for -Inf/Inf/NaN.