Documentation ¶
Overview ¶
Example (Protobuf) ¶
This example defines, encodes, and decodes a Person message format equivalent to the example used in the Protocol Buffers overview.
package main import ( "encoding/hex" "fmt" ) // Go-based protobuf definition for the example Person message format type Person struct { Name string // = 1, required Id int32 // = 2, required Email *string // = 3, optional Phone []PhoneNumber // = 4, repeated } type PhoneType uint32 // protobuf enums are uint32 const ( MOBILE PhoneType = iota // = 0 HOME // = 1 WORK // = 2 ) type PhoneNumber struct { Number string // = 1, required Type *PhoneType // = 2, optional } // This example defines, encodes, and decodes a Person message format // equivalent to the example used in the Protocol Buffers overview. func main() { // Create a Person record email := "alice@somewhere" ptype := WORK person := Person{"Alice", 123, &email, []PhoneNumber{PhoneNumber{"111-222-3333", nil}, PhoneNumber{"444-555-6666", &ptype}}} // Encode it buf, err := Encode(&person) if err != nil { panic("Encode failed: " + err.Error()) } fmt.Print(hex.Dump(buf)) // Decode it person2 := Person{} if err := Decode(buf, &person2); err != nil { panic("Decode failed") } }
Output: 00000000 0a 05 41 6c 69 63 65 10 f6 01 1a 0f 61 6c 69 63 |..Alice.....alic| 00000010 65 40 73 6f 6d 65 77 68 65 72 65 22 0e 0a 0c 31 |e@somewhere"...1| 00000020 31 31 2d 32 32 32 2d 33 33 33 33 22 10 0a 0c 34 |11-222-3333"...4| 00000030 34 34 2d 35 35 35 2d 36 36 36 36 10 02 |44-555-6666..|
Index ¶
- func Decode(buf []byte, structPtr interface{}) error
- func DecodeWithConstructors(buf []byte, structPtr interface{}, cons Constructors) (err error)
- func Encode(structPtr interface{}) (bytes []byte, err error)
- func GenerateProtobufDefinition(w io.Writer, types []interface{}, enumMap EnumMap, renamer GeneratorNamer) (err error)
- func RegisterInterface(f InterfaceGeneratorFunc)
- type Constructors
- type DefaultGeneratorNamer
- type Enum
- type EnumMap
- type GeneratorID
- type GeneratorNamer
- type InterfaceGeneratorFunc
- type InterfaceMarshaler
- type ProtoField
- type Sfixed32
- type Sfixed64
- type TagPrefix
- type Ufixed32
- type Ufixed64
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Decode ¶
Decode a protocol buffer into a Go struct. The caller must pass a pointer to the struct to decode into.
Decode() currently does not explicitly check that all 'required' fields are actually present in the input buffer being decoded. If required fields are missing, then the corresponding fields will be left unmodified, meaning they will take on their default Go zero values if Decode() is passed a fresh struct.
func DecodeWithConstructors ¶
func DecodeWithConstructors(buf []byte, structPtr interface{}, cons Constructors) (err error)
DecodeWithConstructors is like Decode, but you can pass a map of constructors with which to instantiate interface types.
func Encode ¶
Encode a Go struct into protocol buffer format. The caller must pass a pointer to the struct to encode.
Example (Test1) ¶
This example encodes the simple message defined at the start of the Protocol Buffers encoding specification: https://developers.google.com/protocol-buffers/docs/encoding
package main import ( "encoding/hex" "fmt" ) type Test1 struct { A uint32 } // This example encodes the simple message defined at the start of // the Protocol Buffers encoding specification: // https://developers.google.com/protocol-buffers/docs/encoding func main() { t := Test1{150} buf, _ := Encode(&t) fmt.Print(hex.Dump(buf)) }
Output: 00000000 08 96 01 |...|
Example (Test2) ¶
This example encodes the Test2 message illustrating strings in the Protocol Buffers encoding specification.
package main import ( "encoding/hex" "fmt" ) type Test2 struct { _ interface{} // = 1 B string // = 2 } // This example encodes the Test2 message illustrating strings // in the Protocol Buffers encoding specification. func main() { t := Test2{B: "testing"} buf, _ := Encode(&t) fmt.Print(hex.Dump(buf)) }
Output: 00000000 12 07 74 65 73 74 69 6e 67 |..testing|
Example (Test3) ¶
This example encodes the Test3 message illustrating embedded messages in the Protocol Buffers encoding specification.
package main import ( "encoding/hex" "fmt" ) type Test3 struct { _ interface{} // = 1 _ interface{} // = 2 C Test1 // = 3 } // This example encodes the Test3 message illustrating embedded messages // in the Protocol Buffers encoding specification. func main() { t := Test3{C: Test1{150}} buf, _ := Encode(&t) fmt.Print(hex.Dump(buf)) }
Output: 00000000 1a 03 08 96 01 |.....|
func GenerateProtobufDefinition ¶
func GenerateProtobufDefinition(w io.Writer, types []interface{}, enumMap EnumMap, renamer GeneratorNamer) (err error)
GenerateProtobufDefinition generates a .proto file from a list of structs via reflection. fieldNamer is a function that maps ProtoField types to generated protobuf field names.
func RegisterInterface ¶ added in v1.0.4
func RegisterInterface(f InterfaceGeneratorFunc)
RegisterInterface registers the generator to be used to decode the type generated by the function
Types ¶
type Constructors ¶
Constructors represents a map defining how to instantiate any interface types that Decode() might encounter while reading and decoding structured data. The keys are reflect.Type values denoting interface types. The corresponding values are functions expected to instantiate, and initialize as necessary, an appropriate concrete object type supporting that interface. A caller could use this capability to support dynamic instantiation of objects of the concrete type appropriate for a given abstract type.
func (*Constructors) String ¶
func (c *Constructors) String() string
String returns an easy way to visualize what you have in your constructors.
type DefaultGeneratorNamer ¶
type DefaultGeneratorNamer struct{}
DefaultGeneratorNamer renames symbols when mapping from Go to .proto files.
The rules are: - Field names are mapped from SomeFieldName to some_field_name. - Type names are not modified. - Constants are mapped form SomeConstantName to SOME_CONSTANT_NAME.
func (*DefaultGeneratorNamer) ConstName ¶
func (d *DefaultGeneratorNamer) ConstName(name string) string
func (*DefaultGeneratorNamer) FieldName ¶
func (d *DefaultGeneratorNamer) FieldName(f ProtoField) string
func (*DefaultGeneratorNamer) TypeName ¶
func (d *DefaultGeneratorNamer) TypeName(name string) string
type Enum ¶
type Enum uint32
Protobufs enums are transmitted as unsigned varints; using this type alias is optional but recommended to ensure they get the correct type.
type GeneratorID ¶ added in v1.0.4
type GeneratorID [8]byte
GeneratorID is the key used to map the generator functions
type GeneratorNamer ¶
type InterfaceGeneratorFunc ¶ added in v1.0.4
type InterfaceGeneratorFunc func() interface{}
InterfaceGeneratorFunc generates an instance of the implementation of an interface
type InterfaceMarshaler ¶ added in v1.0.4
type InterfaceMarshaler interface { encoding.BinaryMarshaler MarshalID() [8]byte }
InterfaceMarshaler is used to differentiate implementations of an interface when encoding/decoding
type ProtoField ¶
type ProtoField struct { ID int64 Prefix TagPrefix Name string // If non-empty, tag-defined field name. Index []int Field reflect.StructField }
ProtoField contains cached reflected metadata for struct fields.
func ProtoFields ¶
func ProtoFields(t reflect.Type) []*ProtoField
func (*ProtoField) Required ¶
func (p *ProtoField) Required() bool
type Sfixed32 ¶
type Sfixed32 int32
Message fields declared to have exactly this type will be transmitted as fixed-size 32-bit signed integers.
type Sfixed64 ¶
type Sfixed64 int64
Message fields declared to have exactly this type will be transmitted as fixed-size 64-bit signed integers.