protobuf: go.dedis.ch/protobuf Index | Examples | Files

package protobuf

import "go.dedis.ch/protobuf"

This example defines, encodes, and decodes a Person message format equivalent to the example used in the Protocol Buffers overview.

Code:

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")
    }

}

Index

Examples

Package Files

decode.go doc.go encode.go field.go generate.go interface.go

func Decode Uses

func Decode(buf []byte, structPtr interface{}) error

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 Uses

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 Uses

func Encode(structPtr interface{}) (bytes []byte, err error)

Encode a Go struct into protocol buffer format. The caller must pass a pointer to the struct to encode.

This example encodes the simple message defined at the start of the Protocol Buffers encoding specification: https://developers.google.com/protocol-buffers/docs/encoding

Code:

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))

}

This example encodes the Test2 message illustrating strings in the Protocol Buffers encoding specification.

Code:

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))

}

This example encodes the Test3 message illustrating embedded messages in the Protocol Buffers encoding specification.

Code:

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))

}

func GenerateProtobufDefinition Uses

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 Uses

func RegisterInterface(f InterfaceGeneratorFunc)

RegisterInterface registers the generator to be used to decode the type generated by the function

type Constructors Uses

type Constructors map[reflect.Type]func() interface{}

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 Uses

func (c *Constructors) String() string

String returns an easy way to visualize what you have in your constructors.

type DefaultGeneratorNamer Uses

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 Uses

func (d *DefaultGeneratorNamer) ConstName(name string) string

func (*DefaultGeneratorNamer) FieldName Uses

func (d *DefaultGeneratorNamer) FieldName(f ProtoField) string

func (*DefaultGeneratorNamer) TypeName Uses

func (d *DefaultGeneratorNamer) TypeName(name string) string

type Enum Uses

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 EnumMap Uses

type EnumMap map[string]interface{}

type GeneratorID Uses

type GeneratorID [8]byte

GeneratorID is the key used to map the generator functions

type GeneratorNamer Uses

type GeneratorNamer interface {
    FieldName(ProtoField) string
    TypeName(name string) string
    ConstName(name string) string
}

type InterfaceGeneratorFunc Uses

type InterfaceGeneratorFunc func() interface{}

InterfaceGeneratorFunc generates an instance of the implementation of an interface

type InterfaceMarshaler Uses

type InterfaceMarshaler interface {
    encoding.BinaryMarshaler
    MarshalID() [8]byte
}

InterfaceMarshaler is used to differentiate implementations of an interface when encoding/decoding

type ProtoField Uses

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 Uses

func ProtoFields(t reflect.Type) []*ProtoField

func (*ProtoField) Required Uses

func (p *ProtoField) Required() bool

type Sfixed32 Uses

type Sfixed32 int32

Message fields declared to have exactly this type will be transmitted as fixed-size 32-bit signed integers.

type Sfixed64 Uses

type Sfixed64 int64

Message fields declared to have exactly this type will be transmitted as fixed-size 64-bit signed integers.

type TagPrefix Uses

type TagPrefix int
const (
    TagNone TagPrefix = iota
    TagOptional
    TagRequired
)

Possible tag options.

func ParseTag Uses

func ParseTag(field reflect.StructField) (id int, opt TagPrefix, name string)

type Ufixed32 Uses

type Ufixed32 uint32

Message fields declared to have exactly this type will be transmitted as fixed-size 32-bit unsigned integers.

type Ufixed64 Uses

type Ufixed64 uint64

Message fields declared to have exactly this type will be transmitted as fixed-size 64-bit unsigned integers.

Package protobuf imports 15 packages (graph) and is imported by 76 packages. Updated 2019-11-26. Refresh now. Tools for package owners.