Skip to content

Commit d935ec2

Browse files
committed
all: update README.md
Change-Id: I60d9ccf1685e2e30327b5a4daf3c65b540c51e88 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/220679 Reviewed-by: Damien Neil <[email protected]>
1 parent c343881 commit d935ec2

File tree

1 file changed

+113
-276
lines changed

1 file changed

+113
-276
lines changed

README.md

Lines changed: 113 additions & 276 deletions
Original file line numberDiff line numberDiff line change
@@ -1,281 +1,118 @@
1-
# Go support for Protocol Buffers - Google's data interchange format
1+
# Go support for Protocol Buffers
22

3+
[![GoDev](https://img.shields.io/static/v1?label=godev&message=reference&color=00add8)](https://pkg.go.dev/mod/github.com/golang/protobuf)
34
[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf)
4-
[![GoDoc](https://godoc.org/github.com/golang/protobuf?status.svg)](https://godoc.org/github.com/golang/protobuf)
55

6-
Google's data interchange format.
7-
Copyright 2010 The Go Authors.
8-
https://github.com/golang/protobuf
9-
10-
This package and the code it generates requires at least Go 1.9.
11-
12-
This software implements Go bindings for protocol buffers. For
13-
information about protocol buffers themselves, see
14-
https://developers.google.com/protocol-buffers/
15-
16-
## Installation ##
17-
18-
To use this software, you must:
19-
- Install the standard C++ implementation of protocol buffers from
20-
https://developers.google.com/protocol-buffers/
21-
- Of course, install the Go compiler and tools from
22-
https://golang.org/
23-
See
24-
https://golang.org/doc/install
25-
for details or, if you are using gccgo, follow the instructions at
26-
https://golang.org/doc/install/gccgo
27-
- Grab the code from the repository and install the proto package.
28-
The simplest way is to run `go get -u github.com/golang/protobuf/protoc-gen-go`.
29-
The compiler plugin, protoc-gen-go, will be installed in $GOBIN,
30-
defaulting to $GOPATH/bin. It must be in your $PATH for the protocol
31-
compiler, protoc, to find it.
32-
33-
This software has two parts: a 'protocol compiler plugin' that
34-
generates Go source files that, once compiled, can access and manage
35-
protocol buffers; and a library that implements run-time support for
36-
encoding (marshaling), decoding (unmarshaling), and accessing protocol
37-
buffers.
38-
39-
There is support for gRPC in Go using protocol buffers.
40-
See the note at the bottom of this file for details.
41-
42-
There are no insertion points in the plugin.
43-
44-
45-
## Using protocol buffers with Go ##
46-
47-
Once the software is installed, there are two steps to using it.
48-
First you must compile the protocol buffer definitions and then import
49-
them, with the support library, into your program.
50-
51-
To compile the protocol buffer definition, run protoc with the --go_out
52-
parameter set to the directory you want to output the Go code to.
53-
54-
protoc --go_out=. *.proto
55-
56-
The generated files will be suffixed .pb.go. See the Test code below
57-
for an example using such a file.
58-
59-
## Packages and input paths ##
60-
61-
The protocol buffer language has a concept of "packages" which does not
62-
correspond well to the Go notion of packages. In generated Go code,
63-
each source `.proto` file is associated with a single Go package. The
64-
name and import path for this package is specified with the `go_package`
65-
proto option:
66-
67-
option go_package = "github.com/golang/protobuf/ptypes/any";
68-
69-
The protocol buffer compiler will attempt to derive a package name and
70-
import path if a `go_package` option is not present, but it is
71-
best to always specify one explicitly.
72-
73-
There is a one-to-one relationship between source `.proto` files and
74-
generated `.pb.go` files, but any number of `.pb.go` files may be
75-
contained in the same Go package.
76-
77-
The output name of a generated file is produced by replacing the
78-
`.proto` suffix with `.pb.go` (e.g., `foo.proto` produces `foo.pb.go`).
79-
However, the output directory is selected in one of two ways. Let
80-
us say we have `inputs/x.proto` with a `go_package` option of
81-
`github.com/golang/protobuf/p`. The corresponding output file may
82-
be:
83-
84-
- Relative to the import path:
85-
86-
```shell
87-
protoc --go_out=. inputs/x.proto
88-
# writes ./github.com/golang/protobuf/p/x.pb.go
89-
```
90-
91-
(This can work well with `--go_out=$GOPATH`.)
92-
93-
- Relative to the input file:
94-
95-
```shell
96-
protoc --go_out=paths=source_relative:. inputs/x.proto
97-
# generate ./inputs/x.pb.go
98-
```
99-
100-
## Generated code ##
101-
102-
The package comment for the proto library contains text describing
103-
the interface provided in Go for protocol buffers. Here is an edited
104-
version.
105-
106-
The proto package converts data structures to and from the
107-
wire format of protocol buffers. It works in concert with the
108-
Go source code generated for .proto files by the protocol compiler.
109-
110-
A summary of the properties of the protocol buffer interface
111-
for a protocol buffer variable v:
112-
113-
- Names are turned from camel_case to CamelCase for export.
114-
- There are no methods on v to set fields; just treat
115-
them as structure fields.
116-
- There are getters that return a field's value if set,
117-
and return the field's default value if unset.
118-
The getters work even if the receiver is a nil message.
119-
- The zero value for a struct is its correct initialization state.
120-
All desired fields must be set before marshaling.
121-
- A Reset() method will restore a protobuf struct to its zero state.
122-
- Non-repeated fields are pointers to the values; nil means unset.
123-
That is, optional or required field int32 f becomes F *int32.
124-
- Repeated fields are slices.
125-
- Helper functions are available to aid the setting of fields.
126-
Helpers for getting values are superseded by the
127-
GetFoo methods and their use is deprecated.
128-
msg.Foo = proto.String("hello") // set field
129-
- Constants are defined to hold the default values of all fields that
130-
have them. They have the form Default_StructName_FieldName.
131-
Because the getter methods handle defaulted values,
132-
direct use of these constants should be rare.
133-
- Enums are given type names and maps from names to values.
134-
Enum values are prefixed with the enum's type name. Enum types have
135-
a String method, and a Enum method to assist in message construction.
136-
- Nested groups and enums have type names prefixed with the name of
137-
the surrounding message type.
138-
- Extensions are given descriptor names that start with E_,
139-
followed by an underscore-delimited list of the nested messages
140-
that contain it (if any) followed by the CamelCased name of the
141-
extension field itself. HasExtension, ClearExtension, GetExtension
142-
and SetExtension are functions for manipulating extensions.
143-
- Oneof field sets are given a single field in their message,
144-
with distinguished wrapper types for each possible field value.
145-
- Marshal and Unmarshal are functions to encode and decode the wire format.
146-
147-
When the .proto file specifies `syntax="proto3"`, there are some differences:
148-
149-
- Non-repeated fields of non-message type are values instead of pointers.
150-
- Enum types do not get an Enum method.
151-
152-
Consider file test.proto, containing
153-
154-
```proto
155-
syntax = "proto2";
156-
package example;
157-
158-
enum FOO { X = 17; };
159-
160-
message Test {
161-
required string label = 1;
162-
optional int32 type = 2 [default=77];
163-
repeated int64 reps = 3;
164-
}
165-
```
166-
167-
To create and play with a Test object from the example package,
168-
169-
```go
170-
package main
171-
172-
import (
173-
"log"
174-
175-
"github.com/golang/protobuf/proto"
176-
"path/to/example"
177-
)
178-
179-
func main() {
180-
test := &example.Test{
181-
Label: proto.String("hello"),
182-
Type: proto.Int32(17),
183-
Reps: []int64{1, 2, 3},
184-
}
185-
data, err := proto.Marshal(test)
186-
if err != nil {
187-
log.Fatal("marshaling error: ", err)
188-
}
189-
newTest := &example.Test{}
190-
err = proto.Unmarshal(data, newTest)
191-
if err != nil {
192-
log.Fatal("unmarshaling error: ", err)
193-
}
194-
// Now test and newTest contain the same data.
195-
if test.GetLabel() != newTest.GetLabel() {
196-
log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
197-
}
198-
// etc.
199-
}
200-
```
201-
202-
## Parameters ##
203-
204-
To pass extra parameters to the plugin, use a comma-separated
205-
parameter list separated from the output directory by a colon:
206-
207-
protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto
208-
209-
- `paths=(import | source_relative)` - specifies how the paths of
210-
generated files are structured. See the "Packages and imports paths"
211-
section above. The default is `import`.
212-
- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to
213-
load. The only plugin in this repo is `grpc`.
214-
- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is
215-
associated with Go package quux/shme. This is subject to the
216-
import_prefix parameter.
217-
218-
The following parameters are deprecated and should not be used:
219-
220-
- `import_prefix=xxx` - a prefix that is added onto the beginning of
221-
all imports.
222-
- `import_path=foo/bar` - used as the package if no input files
223-
declare `go_package`. If it contains slashes, everything up to the
224-
rightmost slash is ignored.
225-
226-
## gRPC Support ##
227-
228-
If a proto file specifies RPC services, protoc-gen-go can be instructed to
229-
generate code compatible with gRPC (http://www.grpc.io/). To do this, pass
230-
the `plugins` parameter to protoc-gen-go; the usual way is to insert it into
231-
the --go_out argument to protoc:
232-
233-
protoc --go_out=plugins=grpc:. *.proto
234-
235-
## Compatibility ##
236-
237-
The library and the generated code are expected to be stable over time.
238-
However, we reserve the right to make breaking changes without notice for the
239-
following reasons:
240-
241-
- Security. A security issue in the specification or implementation may come to
242-
light whose resolution requires breaking compatibility. We reserve the right
243-
to address such security issues.
244-
- Unspecified behavior. There are some aspects of the Protocol Buffers
245-
specification that are undefined. Programs that depend on such unspecified
246-
behavior may break in future releases.
247-
- Specification errors or changes. If it becomes necessary to address an
248-
inconsistency, incompleteness, or change in the Protocol Buffers
249-
specification, resolving the issue could affect the meaning or legality of
250-
existing programs. We reserve the right to address such issues, including
251-
updating the implementations.
252-
- Bugs. If the library has a bug that violates the specification, a program
253-
that depends on the buggy behavior may break if the bug is fixed. We reserve
254-
the right to fix such bugs.
255-
- Adding methods or fields to generated structs. These may conflict with field
256-
names that already exist in a schema, causing applications to break. When the
257-
code generator encounters a field in the schema that would collide with a
258-
generated field or method name, the code generator will append an underscore
259-
to the generated field or method name.
260-
- Adding, removing, or changing methods or fields in generated structs that
261-
start with `XXX`. These parts of the generated code are exported out of
262-
necessity, but should not be considered part of the public API.
263-
- Adding, removing, or changing unexported symbols in generated code.
6+
This module
7+
([`github.com/golang/protobuf`](https://pkg.go.dev/mod/github.com/golang/protobuf))
8+
contains Go bindings for protocol buffers.
9+
10+
It has been superseded by the
11+
[`google.golang.org/protobuf`](https://pkg.go.dev/mod/google.golang.org/protobuf)
12+
module, which contains an updated and simplified API,
13+
support for protobuf reflection, and many other improvements.
14+
We recommend that new code use the `google.golang.org/protobuf` module.
15+
16+
Versions v1.4 and later of `github.com/golang/protobuf` are implemented
17+
in terms of `google.golang.org/protobuf`.
18+
Programs which use both modules should use at least version v1.4 of this one.
19+
20+
See
21+
[release note documentation](https://github.com/golang/protobuf/releases)
22+
for more information about individual releases of this project.
23+
24+
See
25+
[documentation for the next major revision](https://pkg.go.dev/mod/google.golang.org/protobuf)
26+
for more information about the purpose, usage, and history of this project.
27+
28+
## Package index
29+
30+
Summary of the packages provided by this module:
31+
32+
* [`proto`](https://pkg.go.dev/github.com/golang/protobuf/proto): Package
33+
`proto` provides functions operating on protobuf messages such as cloning,
34+
merging, and checking equality, as well as binary serialization and text
35+
serialization.
36+
* [`jsonpb`](https://pkg.go.dev/github.com/golang/protobuf/jsonpb): Package
37+
`jsonpb` serializes protobuf messages as JSON.
38+
* [`ptypes`](https://pkg.go.dev/github.com/golang/protobuf/ptypes): Package
39+
`ptypes` provides helper functionality for protobuf well-known types.
40+
* [`ptypes/any`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/any):
41+
Package `any` is the generated package for `google/protobuf/any.proto`.
42+
* [`ptypes/empty`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/empty):
43+
Package `empty` is the generated package for `google/protobuf/empty.proto`.
44+
* [`ptypes/timestamp`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/timestamp):
45+
Package `timestamp` is the generated package for
46+
`google/protobuf/timestamp.proto`.
47+
* [`ptypes/duration`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/duration):
48+
Package `duration` is the generated package for
49+
`google/protobuf/duration.proto`.
50+
* [`ptypes/wrappers`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/wrappers):
51+
Package `wrappers` is the generated package for
52+
`google/protobuf/wrappers.proto`.
53+
* [`ptypes/struct`](https://pkg.go.dev/github.com/golang/protobuf/ptypes/struct):
54+
Package `struct` is the generated package for
55+
`google/protobuf/struct.proto`.
56+
* [`protoc-gen-go/descriptor`](https://pkg.go.dev/github.com/golang/protobuf/protoc-gen-go/descriptor):
57+
Package `descriptor` is the generated package for
58+
`google/protobuf/descriptor.proto`.
59+
* [`protoc-gen-go/plugin`](https://pkg.go.dev/github.com/golang/protobuf/protoc-gen-go/plugin):
60+
Package `plugin` is the generated package for
61+
`google/protobuf/compiler/plugin.proto`.
62+
* [`protoc-gen-go`](https://pkg.go.dev/github.com/golang/protobuf/protoc-gen-go):
63+
The `protoc-gen-go` binary is a protoc plugin to generate a Go protocol
64+
buffer package.
65+
66+
## Reporting issues
67+
68+
The issue tracker for this project
69+
[is located here](https://github.com/golang/protobuf/issues).
70+
71+
Please report any issues with a sufficient description of the bug or feature
72+
request. Bug reports should ideally be accompanied by a minimal reproduction of
73+
the issue. Irreproducible bugs are difficult to diagnose and fix (and likely to
74+
be closed after some period of time). Bug reports must specify the version of
75+
the
76+
[Go protocol buffer module](https://github.com/protocolbuffers/protobuf-go/releases)
77+
and also the version of the
78+
[protocol buffer toolchain](https://github.com/protocolbuffers/protobuf/releases)
79+
being used.
80+
81+
## Contributing
82+
83+
This project is open-source and accepts contributions. See the
84+
[contribution guide](https://github.com/golang/protobuf/blob/master/CONTRIBUTING.md)
85+
for more information.
86+
87+
## Compatibility
88+
89+
This module and the generated code are expected to be stable over time. However,
90+
we reserve the right to make breaking changes without notice for the following
91+
reasons:
92+
93+
* **Security:** A security issue in the specification or implementation may
94+
come to light whose resolution requires breaking compatibility. We reserve
95+
the right to address such issues.
96+
* **Unspecified behavior:** There are some aspects of the protocol buffer
97+
specification that are undefined. Programs that depend on unspecified
98+
behavior may break in future releases.
99+
* **Specification changes:** It may become necessary to address an
100+
inconsistency, incompleteness, or change in the protocol buffer
101+
specification, which may affect the behavior of existing programs. We
102+
reserve the right to address such changes.
103+
* **Bugs:** If a package has a bug that violates correctness, a program
104+
depending on the buggy behavior may break if the bug is fixed. We reserve
105+
the right to fix such bugs.
106+
* **Generated additions**: We reserve the right to add new declarations to
107+
generated Go packages of `.proto` files. This includes declared constants,
108+
variables, functions, types, fields in structs, and methods on types. This
109+
may break attempts at injecting additional code on top of what is generated
110+
by `protoc-gen-go`. Such practice is not supported by this project.
111+
* **Internal changes**: We reserve the right to add, modify, and remove
112+
internal code, which includes all unexported declarations, the
113+
[`generator`](https://pkg.go.dev/github.com/golang/protobuf/protoc-gen-go/generator)
114+
package, and all packages under
115+
[`internal`](https://pkg.go.dev/github.com/golang/protobuf/internal).
264116

265117
Any breaking changes outside of these will be announced 6 months in advance to
266-
267-
268-
You should, whenever possible, use generated code created by the `protoc-gen-go`
269-
tool built at the same commit as the `proto` package. The `proto` package
270-
declares package-level constants in the form `ProtoPackageIsVersionX`.
271-
Application code and generated code may depend on one of these constants to
272-
ensure that compilation will fail if the available version of the proto library
273-
is too old. Whenever we make a change to the generated code that requires newer
274-
library support, in the same commit we will increment the version number of the
275-
generated code and declare a new package-level constant whose name incorporates
276-
the latest version number. Removing a compatibility constant is considered a
277-
breaking change and would be subject to the announcement policy stated above.
278-
279-
The `protoc-gen-go/generator` package exposes a plugin interface,
280-
which is used by the gRPC code generation. This interface is not
281-
supported and is subject to incompatible changes without notice.
118+
[[email protected]](https://groups.google.com/forum/#!forum/protobuf).

0 commit comments

Comments
 (0)