ruiaylin / goprotobuf

Automatically exported from code.google.com/p/goprotobuf
Other
0 stars 0 forks source link

Go support for Protocol Buffers - Google's data interchange format Copyright 2010 The Go Authors. http://code.google.com/p/goprotobuf/

This package and the code it generates requires at least Go 1.1.

This software implements Go bindings for protocol buffers. For information about protocol buffers themselves, see http://code.google.com/apis/protocolbuffers/ To use this software, you must first install the standard C++ implementation of protocol buffers from http://code.google.com/p/protobuf/ And of course you must also install the Go compiler and tools from http://code.google.com/p/go/ See http://golang.org/doc/install.html for details or, if you are using gccgo, follow the instructions at http://golang.org/doc/gccgo_install.html

This software has two parts: a 'protocol compiler plugin' that generates Go source files that, once compiled, can access and manage protocol buffers; and a library that implements run-time support for encoding (marshaling), decoding (unmarshaling), and accessing protocol buffers.

There is no support for RPC in Go using protocol buffers. It may come once a standard RPC protocol develops for protobufs.

There are no insertion points in the plugin.

To install this code:

The simplest way is to run go get.

# Grab the code from the repository and install the proto package.
go get -u code.google.com/p/goprotobuf/{proto,protoc-gen-go}

The compiler plugin, protoc-gen-go, will be installed in $GOBIN, defaulting to $GOPATH/bin. It must be in your $PATH for the protocol compiler, protoc, to find it.

Once the software is installed, there are two steps to using it. First you must compile the protocol buffer definitions and then import them, with the support library, into your program.

To compile the protocol buffer definition, run protoc with the --go_out parameter set to the directory you want to output the Go code to.

protoc --go_out=. *.proto

The generated files will be suffixed .pb.go. See the Test code below for an example using such a file.

This repository uses the same code review mechanism as Go, so if you wish to submit changes add the equivalent of these two lines to $GOROOT/src/pkg/code.google.com/p/goprotobuf/.hg/hgrc

[extensions]
codereview = $GOROOT/lib/codereview/codereview.py

where $GOROOT is the expanded text, such as /usr/foo/go.

The package comment for the proto library contains text describing the interface provided in Go for protocol buffers. Here is an edited version.

==========

The proto package converts data structures to and from the wire format of protocol buffers. It works in concert with the Go source code generated for .proto files by the protocol compiler.

A summary of the properties of the protocol buffer interface for a protocol buffer variable v:

Consider file test.proto, containing

package example;

enum FOO { X = 17; };

message Test {
  required string label = 1;
  optional int32 type = 2 [default=77];
  repeated int64 reps = 3;
  optional group OptionalGroup = 4 {
    required string RequiredField = 5;
  }
}

To build a package from test.proto and some other Go files, write a Makefile like this:

include $(GOROOT)/src/Make.$(GOARCH)

TARG=path/to/example
GOFILES=\
    test.pb.go\
    other.go

include $(GOROOT)/src/Make.pkg
include $(GOROOT)/src/pkg/code.google.com/p/goprotobuf/Make.protobuf

To create and play with a Test object from the example package,

package main

import (
    "log"

    "code.google.com/p/goprotobuf/proto"
    "path/to/example"
)

func main() {
    test := &example.Test {
        Label: proto.String("hello"),
        Type:  proto.Int32(17),
        Optionalgroup: &example.Test_OptionalGroup {
            RequiredField: proto.String("good bye"),
        },
    }
    data, err := proto.Marshal(test)
    if err != nil {
        log.Fatal("marshaling error: ", err)
    }
    newTest := &example.Test{}
    err = proto.Unmarshal(data, newTest)
    if err != nil {
        log.Fatal("unmarshaling error: ", err)
    }
    // Now test and newTest contain the same data.
    if test.GetLabel() != newTest.GetLabel() {
        log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
    }
    // etc.
}