Source File
message.go
Belonging Package
google.golang.org/protobuf/internal/impl
package impl
import (
pref
)
GoReflectType reflect.Type // pointer to struct
OneofWrappers []interface{}
initMu sync.Mutex // protects all unexported fields
initDone uint32
reflectMessageInfo // for reflection implementation
coderMessageInfo // for fast-path method implementations
}
func ( reflect.Type) *MessageInfo {
, := reflect.Zero().Interface().(pref.ProtoMessage)
if ! {
return nil
}
, := .ProtoReflect().(interface{ () *MessageInfo })
if ! {
return nil
}
return .()
}
if atomic.LoadUint32(&.initDone) == 0 {
.initOnce()
}
}
func ( *MessageInfo) () {
.initMu.Lock()
defer .initMu.Unlock()
if .initDone == 1 {
return
}
:= .GoReflectType
if .Kind() != reflect.Ptr && .Elem().Kind() != reflect.Struct {
panic(fmt.Sprintf("got %v, want *struct kind", ))
}
= .Elem()
:= .makeStructInfo()
.makeReflectFuncs(, )
.makeCoderMethods(, )
atomic.StoreUint32(&.initDone, 1)
}
func ( *MessageInfo) ( pref.Message) ( pointer, bool) {
switch m := .(type) {
case *messageState:
return .pointer(), .messageInfo() ==
case *messageReflectWrapper:
return .pointer(), .messageInfo() ==
}
return pointer{}, false
}
type (
SizeCache = int32
WeakFields = map[int32]protoreflect.ProtoMessage
UnknownFields = []byte
ExtensionFields = map[int32]ExtensionField
)
var (
sizecacheType = reflect.TypeOf(SizeCache(0))
weakFieldsType = reflect.TypeOf(WeakFields(nil))
unknownFieldsType = reflect.TypeOf(UnknownFields(nil))
extensionFieldsType = reflect.TypeOf(ExtensionFields(nil))
)
type structInfo struct {
sizecacheOffset offset
weakOffset offset
unknownOffset offset
extensionOffset offset
fieldsByNumber map[pref.FieldNumber]reflect.StructField
oneofsByName map[pref.Name]reflect.StructField
oneofWrappersByType map[reflect.Type]pref.FieldNumber
oneofWrappersByNumber map[pref.FieldNumber]reflect.Type
}
func ( *MessageInfo) ( reflect.Type) structInfo {
:= structInfo{
sizecacheOffset: invalidOffset,
weakOffset: invalidOffset,
unknownOffset: invalidOffset,
extensionOffset: invalidOffset,
fieldsByNumber: map[pref.FieldNumber]reflect.StructField{},
oneofsByName: map[pref.Name]reflect.StructField{},
oneofWrappersByType: map[reflect.Type]pref.FieldNumber{},
oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{},
}
:
for := 0; < .NumField(); ++ {
switch := .Field(); .Name {
case genid.SizeCache_goname, genid.SizeCacheA_goname:
if .Type == sizecacheType {
.sizecacheOffset = offsetOf(, .Exporter)
}
case genid.WeakFields_goname, genid.WeakFieldsA_goname:
if .Type == weakFieldsType {
.weakOffset = offsetOf(, .Exporter)
}
case genid.UnknownFields_goname, genid.UnknownFieldsA_goname:
if .Type == unknownFieldsType {
.unknownOffset = offsetOf(, .Exporter)
}
case genid.ExtensionFields_goname, genid.ExtensionFieldsA_goname, genid.ExtensionFieldsB_goname:
if .Type == extensionFieldsType {
.extensionOffset = offsetOf(, .Exporter)
}
default:
for , := range strings.Split(.Tag.Get("protobuf"), ",") {
if len() > 0 && strings.Trim(, "0123456789") == "" {
, := strconv.ParseUint(, 10, 64)
.fieldsByNumber[pref.FieldNumber()] =
continue
}
}
if := .Tag.Get("protobuf_oneof"); len() > 0 {
.oneofsByName[pref.Name()] =
continue
}
}
}
:= .OneofWrappers
for , := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} {
if , := reflect.PtrTo().MethodByName(); {
for , := range .Func.Call([]reflect.Value{reflect.Zero(.Type.In(0))}) {
if , := .Interface().([]interface{}); {
=
}
}
}
}
for , := range {
:= reflect.TypeOf().Elem()
:= .Field(0)
for , := range strings.Split(.Tag.Get("protobuf"), ",") {
if len() > 0 && strings.Trim(, "0123456789") == "" {
, := strconv.ParseUint(, 10, 64)
.oneofWrappersByType[] = pref.FieldNumber()
.oneofWrappersByNumber[pref.FieldNumber()] =
break
}
}
}
return
}
func ( *MessageInfo) () protoreflect.Message {
return .MessageOf(reflect.New(.GoReflectType.Elem()).Interface())
}
func ( *MessageInfo) () protoreflect.Message {
return .MessageOf(reflect.Zero(.GoReflectType).Interface())
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |