有关缺少"Unimplemented"服务器方法的 gRPC 错误



this my proto file:

syntax = "proto3";
option go_package = ".;pb";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply); // hello
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}

* *

package main
import (
"awesomeProject/grpc_test/proto"
"context"
"google.golang.org/grpc"
"net"
)

type Server struct {}
func (s *Server) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{
Message: "hello" + request.Name,
}, nil
}
func main() {
g := grpc.NewServer()
pb.RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", "0.0.0.0:8080")
if err != nil {
panic("failed to listen: " + err.Error() )
}
err = g.Serve(lis)
if err != nil {
panic("failed to start grpc: " + err.Error())
}
}

和我得到一个错误:

cannot use &Server{} (type *Server) as type pb.GreeterServer in argument to pb.RegisterGreeterServer:*Server does not implement pb.GreeterServer (missing pb.mustEmbedUnimplementedGreeterServer method)

如何解决?

这在这个README中有介绍(这个问题和这个问题提供了很多,也许太多了!

解决方案将是编辑您的struct定义(如错误提示)为:

type Server struct {
proto.UnimplementedGreeterServer
}

你可能还想看看快速入门。您的服务似乎是由此衍生的,您将注意到main.go(这里的/examples/helloworld/greeter_server/main.go)包含类似的struct定义。

添加proto.UnimplementedGreeterServer提供了所有服务的默认实现(生成代码的一部分);例如:

func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
}

在结构中包含UnimplementedGreeterServer意味着如果你向proto文件添加一个新服务,然后重新编译你的应用程序,它将编译没有错误,并且如果客户端试图调用新服务返回一个未实现的错误。前面提到的问题包括很多关于为什么选择这种方法的讨论。

最新更新