生成的代码参考

该页面描述了在使用 protoc-gen-go-grpc grpc 插件 编译 .proto 文件时生成的代码。此版本的生成代码默认使用泛型。如果您正在使用不支持泛型的旧版生成代码,可以在 此处 找到相关文档。虽然我们鼓励使用带泛型的最新版本,但您可以通过将 useGenericStreams 标志设置为 false 来暂时恢复旧行为。

有关如何在 .proto 文件中定义 gRPC 服务的信息,请参见 服务定义

线程安全:请注意,客户端 RPC 调用和服务器端 RPC 处理程序是线程安全的,旨在并发 goroutine 上运行。但也要注意,对于单独的流,进出数据是双向的但为串行的;例如,单独的流不支持并发读取或并发写入(但读取与写入是线程安全并发的)。

生成的服务器接口方法

在服务器端,.proto 文件中的每个 service Bar 都会生成以下函数:

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

应用程序可以定义一个 BarServer 接口的具体实现,并使用该函数将其注册到 grpc.Server 实例中(在启动服务器实例之前)。

一元方法

这些方法在生成的服务接口中的签名如下:

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

在这里,RequestMsg 是从客户端发送的 protobuf 消息,ResponseMsg 是从服务器返回的 protobuf 消息。

服务器流方法

这些方法在生成的服务接口中的签名如下:

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

在这里,RequestMsg 是客户端发送的单个请求,https://pkg.go.dev/google.golang.org/grpc#ServerStreamingServer[grpc.ServerStreamingServer] 表示服务器端到客户端的响应流,流的消息类型为 ResponseMsg

有关详细使用信息,请参见 grpc.ServerStreamingServer 文档。

客户端流方法

这些方法在生成的服务接口中的签名如下:

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

在这里,RequestMsg 是客户端到服务器流中的消息类型,ResponseMsg 是从服务器返回的响应类型。

在这种情况下,grpc.ClientStreamingServer 可用于读取客户端到服务器的消息流并发送单个服务器响应消息。

有关详细使用信息,请参见 grpc.ClientStreamingServer 文档。

双向流方法

这些方法在生成的服务接口中的签名如下:

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

在这里,RequestMsg 是客户端到服务器流中的消息类型,ResponseMsg 是从服务器到客户端的流类型。

在这种情况下,grpc.BidiStreamingServer 可用于访问客户端到服务器的消息流以及服务器到客户端的消息流。

有关详细使用信息,请参见 grpc.BidiStreamingServer 文档。

生成的客户端接口方法

对于客户端使用,.proto 文件中的每个服务 Bar 还会生成以下函数:

func BarClient(cc *grpc.ClientConn) BarClient

此函数返回 BarClient 接口的具体实现(该实现也位于生成的 .pb.go 文件中)。

一元方法

这些方法在生成的客户端存根中的签名如下:

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

在这里,RequestMsg 是客户端发送到服务器的单个请求,ResponseMsg 是从服务器返回的响应消息。

服务器流方法

这些方法在生成的客户端存根中的签名如下:

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

在这里,grpc.ServerStreamingClient 表示服务器到客户端的响应流,消息类型为 ResponseMsg

有关详细使用信息,请参见 grpc.ServerStreamingClient 文档。

客户端流方法

这些方法在生成的客户端存根中的签名如下:

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

在这里,grpc.ClientStreamingClient 表示客户端到服务器的请求流,消息类型为 RequestMsg。它可以用于发送客户端到服务器的消息流并接收单个服务器响应消息。

有关详细使用信息,请参见 grpc.ClientStreamingClient 文档。

双向流方法

这些方法在生成的客户端存根中的签名如下:

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

在这里,grpc.BidiStreamingClient 表示客户端到服务器和服务器到客户端的双向消息流。

有关详细使用信息,请参见 grpc.BidiStreamingClient 文档。

包和命名空间

当使用 --go_out=plugins=grpc: 调用 protoc 编译器时,proto 包到 Go 包的转换与未使用 grpc 插件时的行为相同。

因此,例如,如果 foo.proto 声明其包为 foo,那么生成的 foo.pb.go 文件也将位于 Go 包 foo 中。