Go语言 类型不能实现“X”,因为它有一个非导出的方法,并且在另一个包中定义

6tqwzwtp  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(178)

我有这个代码:

s := grpc.NewServer()
pb.RegisterMessageServiceServer(s, &messageServer{})

我有这个错误:
无法使用“&messageServer{}”(type *messageServer),因为类型MessageServiceServer Type无法实现“MessageServiceServer”,因为它具有非导出的方法,并且在不同的包中定义
我的messageServer结构体看起来像:

type messageServer struct{}

func (s *messageServer) mustEmbedUnimplementedMessageServiceServer() {
    //TODO implement me
    panic("implement me")
}

func (s *messageServer) MustEmbedUnimplementedMessageServiceServer() {
    //TODO implement me
    panic("implement me")
}

func (s *messageServer) SendMessage(ctx context.Context, msg *pb.Message) (*pb.Response, error) {
    // Write the message to Kafka
    producer, err := sarama.NewSyncProducer([]string{kafkaBroker}, nil)
    if err != nil {
        log.Fatalf("Error creating Kafka producer: %v", err)
        return nil, err
    }
    defer producer.Close()

    kafkaMsg := &sarama.ProducerMessage{
        Topic: kafkaTopic,
        Value: sarama.StringEncoder(msg.Content),
    }

    _, _, err = producer.SendMessage(kafkaMsg)
    if err != nil {
        log.Printf("Failed to send message to Kafka: %v", err)
        return nil, err
    }

    return &pb.Response{Message: "Message sent to Kafka"}, nil
}

错误在这一行:

pb.RegisterMessageServiceServer(s, &messageServer{}) // here

不知道发生了什么事:(

thigvfpy

thigvfpy1#

你不应该提供mustEmbedUnimplementedMessageServiceServer()的实现。你应该让你的服务器结构嵌入UnimplementedMessageServiceServer。这个成员被命名为告诉你。界面还有一个doc注解,
所有实现都必须嵌入UnimplementedMessageServiceServer以实现向前兼容性。
这个想法是,总有一天,gRPC开发人员可能会向服务器接口添加一个新方法。如果这样做了,它们还会向unimplemented类型添加一个新方法,该方法返回“method Blah not implemented”错误。由于你被迫将它们的unimplemented类型嵌入到你的服务器类型中,你将继承那个方法,并得到一个抛出错误的默认实现,而不是让你的代码突然开始失败,因为你的服务器类型缺少新方法。

相关问题