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/master/protobuf/protoc-gen-protoactor/main.go">vanity command</a> that also generates actors from service definitions
42  - <a href="https://containerd.io/">containerd</a> - <a href="https://github.com/containerd/containerd/tree/master/cmd/protoc-gen-gogoctrd">vanity command with custom field names</a> that conforms to the golang convention.
43  - <a href="https://github.com/heroiclabs/nakama">nakama</a>
44  - <a href="https://github.com/src-d/proteus">proteus</a>
45  - <a href="https://github.com/go-graphite">carbonzipper stack</a>
46  - <a href="https://sendgrid.com/">sendgrid</a>
47  - <a href="https://github.com/zero-os/0-stor">zero-os/0-stor</a>
48  - <a href="https://github.com/spacemeshos/go-spacemesh">go-spacemesh</a>
49
50Please let us know if you are using gogoprotobuf by posting on our <a href="https://groups.google.com/forum/#!topic/gogoprotobuf/Brw76BxmFpQ">GoogleGroup</a>.
51
52### Mentioned
53
54  - <a href="http://www.slideshare.net/albertstrasheim/serialization-in-go">Cloudflare - go serialization talk - Albert Strasheim</a>
55  - <a href="https://youtu.be/4xB46Xl9O9Q?t=557">GopherCon 2014 Writing High Performance Databases in Go by Ben Johnson</a>
56  - <a href="https://github.com/alecthomas/go_serialization_benchmarks">alecthomas' go serialization benchmarks</a>
57  - <a href="http://agniva.me/go/2017/11/18/gogoproto.html">Go faster with gogoproto - Agniva De Sarker</a>
58  - <a href="https://www.youtube.com/watch?v=CY9T020HLP8">Evolution of protobuf (Gource Visualization) - Landon Wilkins</a>
59  - <a href="https://fosdem.org/2018/schedule/event/gopherjs/">Creating GopherJS Apps with gRPC-Web - Johan Brandhorst</a>
60  - <a href="https://jbrandhorst.com/post/gogoproto/">So you want to use GoGo Protobuf - Johan Brandhorst</a>
61  - <a href="https://jbrandhorst.com/post/grpc-errors/">Advanced gRPC Error Usage - Johan Brandhorst</a>
62
63## Getting Started
64
65There are several ways to use gogoprotobuf, but for all you need to install go and protoc.
66After that you can choose:
67
68  - Speed
69  - More Speed and more generated code
70  - Most Speed and most customization
71
72### Installation
73
74To install it, you must first have Go (at least version 1.6.3 or 1.9 if you are using gRPC) installed (see [http://golang.org/doc/install](http://golang.org/doc/install)).
75Latest patch versions of 1.9 and 1.10 are continuously tested.
76
77Next, install the standard protocol buffer implementation from [https://github.com/google/protobuf](https://github.com/google/protobuf).
78Most versions from 2.3.1 should not give any problems, but 2.6.1, 3.0.2 and 3.5.1 are continuously tested.
79
80### Speed
81
82Install the protoc-gen-gofast binary
83
84    go get github.com/gogo/protobuf/protoc-gen-gofast
85
86Use it to generate faster marshaling and unmarshaling go code for your protocol buffers.
87
88    protoc --gofast_out=. myproto.proto
89
90This does not allow you to use any of the other gogoprotobuf [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md).
91
92### More Speed and more generated code
93
94Fields without pointers cause less time in the garbage collector.
95More code generation results in more convenient methods.
96
97Other binaries are also included:
98
99    protoc-gen-gogofast (same as gofast, but imports gogoprotobuf)
100    protoc-gen-gogofaster (same as gogofast, without XXX_unrecognized, less pointer fields)
101    protoc-gen-gogoslick (same as gogofaster, but with generated string, gostring and equal methods)
102
103Installing any of these binaries is easy.  Simply run:
104
105    go get github.com/gogo/protobuf/proto
106    go get github.com/gogo/protobuf/{binary}
107    go get github.com/gogo/protobuf/gogoproto
108
109These binaries allow you to use gogoprotobuf [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md). You can also use your own binary.
110
111To generate the code, you also need to set the include path properly.
112
113    protoc -I=. -I=$GOPATH/src -I=$GOPATH/src/github.com/gogo/protobuf/protobuf --{binary}_out=. myproto.proto
114
115To use proto files from "google/protobuf" you need to add additional args to protoc.
116
117    protoc -I=. -I=$GOPATH/src -I=$GOPATH/src/github.com/gogo/protobuf/protobuf --{binary}_out=\
118    Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,\
119    Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,\
120    Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types,\
121    Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,\
122    Mgoogle/protobuf/wrappers.proto=github.com/gogo/protobuf/types:. \
123    myproto.proto
124
125Note that in the protoc command, {binary} does not contain the initial prefix of "protoc-gen".
126
127### Most Speed and most customization
128
129Customizing 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.
130gogoprotobuf also offers more serialization formats and generation of tests and even more methods.
131
132Please visit the [extensions](https://github.com/gogo/protobuf/blob/master/extensions.md) page for more documentation.
133
134Install protoc-gen-gogo:
135
136    go get github.com/gogo/protobuf/proto
137    go get github.com/gogo/protobuf/jsonpb
138    go get github.com/gogo/protobuf/protoc-gen-gogo
139    go get github.com/gogo/protobuf/gogoproto
140
141## GRPC
142
143It works the same as golang/protobuf, simply specify the plugin.
144Here is an example using gofast:
145
146    protoc --gofast_out=plugins=grpc:. my.proto
147
148See [https://github.com/gogo/grpc-example](https://github.com/gogo/grpc-example) for an example of using gRPC with gogoprotobuf and the wider grpc-ecosystem.
149
150
151
152