1# Protocol Buffers for Go with Gadgets
2
3[![Build Status](https://travis-ci.org/gogo/protobuf.svg?branch=master)](https://travis-ci.org/gogo/protobuf)
4
5gogoprotobuf is a fork of <a href="https://github.com/golang/protobuf">golang/protobuf</a> with extra code generation features.
6
7This code generation is used to achieve:
8
9  - fast marshalling and unmarshalling
10  - more canonical Go structures
11  - goprotobuf compatibility
12  - less typing by optionally generating extra helper code
13  - peace of mind by optionally generating test and benchmark code
14  - other serialization formats
15
16Keeping track of how up to date gogoprotobuf is relative to golang/protobuf is done in this
17<a href="https://github.com/gogo/protobuf/issues/191">issue</a>
18
19## Users
20
21These projects use gogoprotobuf:
22
23  - <a href="http://godoc.org/github.com/coreos/etcd">etcd</a> - <a href="https://blog.gopheracademy.com/advent-2015/etcd-distributed-key-value-store-with-grpc-http2/">blog</a> - <a href="https://github.com/coreos/etcd/blob/master/etcdserver/etcdserverpb/etcdserver.proto">sample proto file</a>
24  - <a href="https://www.spacemonkey.com/">spacemonkey</a> - <a href="https://www.spacemonkey.com/blog/posts/go-space-monkey">blog</a>
25  - <a href="http://badoo.com">badoo</a> - <a href="https://github.com/badoo/lsd/blob/32061f501c5eca9c76c596d790b450501ba27b2f/proto/lsd.proto">sample proto file</a>
26  - <a href="https://github.com/mesos/mesos-go">mesos-go</a> - <a href="https://github.com/mesos/mesos-go/blob/f9e5fb7c2f50ab5f23299f26b6b07c5d6afdd252/api/v0/mesosproto/authentication.proto">sample proto file</a>
27  - <a href="https://github.com/mozilla-services/heka">heka</a> - <a href="https://github.com/mozilla-services/heka/commit/eb72fbf7d2d28249fbaf8d8dc6607f4eb6f03351">the switch from golang/protobuf to gogo/protobuf when it was still on code.google.com</a>
28  - <a href="https://github.com/cockroachdb/cockroach">cockroachdb</a> - <a href="https://github.com/cockroachdb/cockroach/blob/651d54d393e391a30154e9117ab4b18d9ee6d845/roachpb/metadata.proto">sample proto file</a>
29  - <a href="https://github.com/jbenet/go-ipfs">go-ipfs</a> - <a href="https://github.com/ipfs/go-ipfs/blob/2b6da0c024f28abeb16947fb452787196a6b56a2/merkledag/pb/merkledag.proto">sample proto file</a>
30  - <a href="https://github.com/philhofer/rkive">rkive-go</a> - <a href="https://github.com/philhofer/rkive/blob/e5dd884d3ea07b341321073882ae28aa16dd11be/rpbc/riak_dt.proto">sample proto file</a>
31  - <a href="https://www.dropbox.com">dropbox</a>
32  - <a href="https://srclib.org/">srclib</a> - <a href="https://github.com/sourcegraph/srclib/blob/6538858f0c410cac5c63440317b8d009e889d3fb/graph/def.proto">sample proto file</a>
33  - <a href="http://www.adyoulike.com/">adyoulike</a>
34  - <a href="http://www.cloudfoundry.org/">cloudfoundry</a> - <a href="https://github.com/cloudfoundry/bbs/blob/d673710b8c4211037805129944ee4c5373d6588a/models/events.proto">sample proto file</a>
35  - <a href="http://kubernetes.io/">kubernetes</a> - <a href="https://github.com/kubernetes/kubernetes/tree/88d8628137f94ee816aaa6606ae8cd045dee0bff/cmd/libs/go2idl">go2idl built on top of gogoprotobuf</a>
36  - <a href="https://dgraph.io/">dgraph</a> - <a href="https://github.com/dgraph-io/dgraph/releases/tag/v0.4.3">release notes</a> - <a href="https://discuss.dgraph.io/t/gogoprotobuf-is-extremely-fast/639">benchmarks</a></a>
37  - <a href="https://github.com/centrifugal/centrifugo">centrifugo</a> - <a href="https://forum.golangbridge.org/t/centrifugo-real-time-messaging-websocket-or-sockjs-server-v1-5-0-released/2861">release notes</a> - <a href="https://medium.com/@fzambia/centrifugo-protobuf-inside-json-outside-21d39bdabd68#.o3icmgjqd">blog</a>
38  - <a href="https://github.com/docker/swarmkit">docker swarmkit</a> - <a href="https://github.com/docker/swarmkit/blob/63600e01af3b8da2a0ed1c9fa6e1ae4299d75edb/api/objects.proto">sample proto file</a>
39  - <a href="https://nats.io/">nats.io</a> - <a href="https://github.com/nats-io/go-nats-streaming/blob/master/pb/protocol.proto">go-nats-streaming</a>
40  - <a href="https://github.com/pingcap/tidb">tidb</a> - Communication between <a href="https://github.com/pingcap/tipb/blob/master/generate-go.sh#L4">tidb</a> and <a href="https://github.com/pingcap/kvproto/blob/master/generate_go.sh#L3">tikv</a>
41  - <a href="https://github.com/AsynkronIT/protoactor-go">protoactor-go</a> - <a href="https://github.com/AsynkronIT/protoactor-go/blob/dev/protobuf/protoc-gen-protoactor/main.go">vanity command</a> that also generates actors from service definitions
42
43Please lets us know if you are using gogoprotobuf by posting on our <a href="https://groups.google.com/forum/#!topic/gogoprotobuf/Brw76BxmFpQ">GoogleGroup</a>.
44
45### Mentioned
46
47  - <a href="http://www.slideshare.net/albertstrasheim/serialization-in-go">Cloudflare - go serialization talk - Albert Strasheim</a>
48  - <a href="http://gophercon.sourcegraph.com/post/83747547505/writing-a-high-performance-database-in-go">gophercon</a>
49  - <a href="https://github.com/alecthomas/go_serialization_benchmarks">alecthomas' go serialization benchmarks</a>
50
51## Getting Started
52
53There are several ways to use gogoprotobuf, but for all you need to install go and protoc.
54After that you can choose:
55
56  - Speed
57  - More Speed and more generated code
58  - Most Speed and most customization
59
60### Installation
61
62To install it, you must first have Go (at least version 1.6.3) installed (see [http://golang.org/doc/install](http://golang.org/doc/install)).  Go 1.7.1 and 1.8 is continuously tested.
63
64Next, install the standard protocol buffer implementation from [https://github.com/google/protobuf](https://github.com/google/protobuf).
65Most versions from 2.3.1 should not give any problems, but 2.6.1, 3.0.2 and 3.1.0 are continuously tested.
66
67### Speed
68
69Install the protoc-gen-gofast binary
70
71    go get github.com/gogo/protobuf/protoc-gen-gofast
72
73Use it to generate faster marshaling and unmarshaling go code for your protocol buffers.
74
75    protoc --gofast_out=. myproto.proto
76
77This does not allow you to use any of the other gogoprotobuf [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md).
78
79### More Speed and more generated code
80
81Fields without pointers cause less time in the garbage collector.
82More code generation results in more convenient methods.
83
84Other binaries are also included:
85
86    protoc-gen-gogofast (same as gofast, but imports gogoprotobuf)
87    protoc-gen-gogofaster (same as gogofast, without XXX_unrecognized, less pointer fields)
88    protoc-gen-gogoslick (same as gogofaster, but with generated string, gostring and equal methods)
89
90Installing any of these binaries is easy.  Simply run:
91
92    go get github.com/gogo/protobuf/proto
93    go get github.com/gogo/protobuf/{binary}
94    go get github.com/gogo/protobuf/gogoproto
95
96These binaries allow you to using gogoprotobuf [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md).
97
98### Most Speed and most customization
99
100Customizing the fields of the messages to be the fields that you actually want to use removes the need to copy between the structs you use and structs you use to serialize.
101gogoprotobuf also offers more serialization formats and generation of tests and even more methods.
102
103Please visit the [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md) page for more documentation.
104
105Install protoc-gen-gogo:
106
107    go get github.com/gogo/protobuf/proto
108    go get github.com/gogo/protobuf/jsonpb
109    go get github.com/gogo/protobuf/protoc-gen-gogo
110    go get github.com/gogo/protobuf/gogoproto
111
112## GRPC
113
114It works the same as golang/protobuf, simply specify the plugin.
115Here is an example using gofast:
116
117    protoc --gofast_out=plugins=grpc:. my.proto
118