Generated-code reference

Generated-code reference

This page describes the code generated when compiling .proto files with protoc, using the protoc-gen-go-grpc grpc plugin. This latest version of generated code uses generics by default. If you’re working with older generated code that doesn’t use generics, you can find the relevant documentation here. While we encourage using this latest version with generics, you can temporarily revert to the old behavior by setting the useGenericStreams flag to false.

You can find out how to define a gRPC service in a .proto file in Service definition.

Thread-safety: note that client-side RPC invocations and server-side RPC handlers are thread-safe and are meant to be run on concurrent goroutines. But also note that for individual streams, incoming and outgoing data is bi-directional but serial; so e.g. individual streams do not support concurrent reads or concurrent writes (but reads are safely concurrent with writes).

Methods on generated server interfaces

On the server side, each service Bar in the .proto file results in the function:

func RegisterBarServer(s *grpc.Server, srv BarServer)

The application can define a concrete implementation of the BarServer interface and register it with a grpc.Server instance (before starting the server instance) by using this function.

Unary methods

These methods have the following signature on the generated service interface:

Foo(context.Context, *RequestMsg) (*ResponseMsg, error)

In this context, RequestMsg is the protobuf message sent from the client, and ResponseMsg is the protobuf message sent back from the server.

Server-streaming methods

These methods have the following signature on the generated service interface: Foo(*RequestMsg, grpc.ServerStreamingServer[*ResponseMsg]) error

In this context, RequestMsg is the single request from the client, and grpc.ServerStreamingServer represents the server side of server-to-client stream of response type ResponseMsg.

Refer to grpc.ServerStreamingServer documentation for detailed usage information.

Client-streaming methods

These methods have the following signature on the generated service interface:

Foo(grpc.ClientStreamingServer[*RequestMsg, *ResponseMsg]) error

Where RequestMsg is the message type of the stream, sent from client-to-server and ResponseMsg is the type of response from server to client.

In this context, grpc.ClientStreamingServer can be used both to read the client-to-server message stream and to send the single server response message.

Refer to grpc.ClientStreamingServer documentation for detailed usage information.

Bidi-streaming methods

These methods have the following signature on the generated service interface:

Foo(grpc.BidiStreamingServer[*RequestMsg, *ResponseMsg]) error

Where RequestMsg is the message type of the stream, sent from client-to-server and ResponseMsg is the type of stream from server-to-client.

In this context, grpc.BidiStreamingServer can be used to access both the client-to-server message stream and the server-to-client message stream.

Refer to grpc.BidiStreamingServer documentation for detailed usage information.

Methods on generated client interfaces

For client side usage, each service Bar in the .proto file also results in the function: func BarClient(cc *grpc.ClientConn) BarClient, which returns a concrete implementation of the BarClient interface (this concrete implementation also lives in the generated .pb.go file).

Unary Methods

These methods have the following signature on the generated client stub:

(ctx context.Context, in *RequestMsg, opts ...grpc.CallOption) (*ResponseMsg, error)

In this context, RequestMsg is the single request from client to server, and ResponseMsg contains the response sent back from the server.

Server-Streaming methods

These methods have the following signature on the generated client stub:

Foo(ctx context.Context, in *RequestMsg, opts ...grpc.CallOption) (grpc.ServerStreamingClient[*ResponseMsg], error)

In this context, grpc.ServerStreamingClient represents the client side of server-to-client stream of ResponseMsg messages.

Refer to grpc.ServerStreamingClient documentation for detailed usage information.

Client-Streaming methods

These methods have the following signature on the generated client stub:

Foo(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[*RequestMsg, *ResponseMsg], error)

In this context, grpc.ClientStreamingClient represents the client side of client-to-server stream of RequestMsg messages. It can be used both to send the client-to-server message stream and to receive the single server response message.

Refer to grpc.ClientStreamingClient documentation for detailed usage information.

Bidi-Streaming methods

These methods have the following signature on the generated client stub:

Foo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[*RequestMsg, *ResponseMsg], error)

In this context, grpc.BidiStreamingClient represents both the client-to-server and server-to-client message streams.

Refer to grpc.BidiStreamingClient documentation for detailed usage information.

Packages and Namespaces

When the protoc compiler is invoked with --go_out=plugins=grpc:, the proto package to Go package translation works the same as when the protoc-gen-go plugin is used without the grpc plugin.

So, for example, if foo.proto declares itself to be in package foo, then the generated foo.pb.go file will also be in the Go package foo.