生成的代码参考
生成的代码参考
本页介绍使用 protoc
编译 .proto
文件时通过 protoc-gen-go-grpc
grpc 插件 生成的代码。最新版本的生成代码默认使用泛型。如果您使用的是不带泛型的旧版生成代码,可以在此处找到相关文档。虽然我们鼓励使用最新版本(带泛型),但您可以通过将 useGenericStreams
标志设置为 false
来暂时恢复旧行为。
您可以在服务定义 中了解如何在 .proto
文件中定义 gRPC 服务。
线程安全:请注意,客户端 RPC 调用和服务器端 RPC 处理程序是线程安全的,并且设计为在并发 goroutines 上运行。但也请注意,对于单个流,传入和传出的数据是双向的,但按顺序处理;因此,例如,单个流不支持并发读取或并发写入(但读取与写入并发是安全的)。
生成的服务器接口上的方法
在服务器端,.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
是来自客户端的单个请求,并且 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
文件中的每个 service 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 package
到 Go 包的转换方式与不使用 grpc
插件而使用 protoc-gen-go
插件时相同。
因此,例如,如果 foo.proto
声明其位于 package foo
中,那么生成的 foo.pb.go
文件也将位于 Go 的 package foo
中。