Maison > Article > développement back-end > Le type ne peut pas implémenter « X » car il possède des méthodes non exportées et est défini dans un package différent
éditeur php Yuzi, bonjour ! Concernant la question de l'implémentation du type "X", puisqu'il possède des méthodes non exportées et qu'il est défini dans un package différent, il ne peut pas être implémenté directement. En PHP, les méthodes et propriétés entre différents packages ne sont pas directement accessibles. Si vous souhaitez implémenter le type « X », vous pouvez envisager d'utiliser des interfaces ou l'héritage pour implémenter indirectement les fonctionnalités requises. Obtenez les méthodes et propriétés requises en définissant une interface et en l'implémentant dans différentes classes, ou en héritant. Cela permet d'implémenter la fonctionnalité de type "X" dans différents packages. J'espère que cela t'aides!
J'ai ce code :
s := grpc.newserver() pb.registermessageserviceserver(s, &messageserver{})
J'ai cette erreur :
cannot use '&messageserver{}' (type *messageserver) as the type messageserviceserver type cannot implement 'messageserviceserver' as it has a non-exported method and is defined in a different package
La structure de mon serveur de messages ressemble à ceci :
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 }
L'erreur est dans cette ligne :
pb.RegisterMessageServiceServer(s, &messageServer{}) // here
Aucune idée de ce qui se passe :(
Vous ne devriez pas fournir mustEmbedUnimplementedMessageServiceServer()
的实现。您应该使您的服务器结构嵌入 UnimplementedMessageServiceServer
. Le membre est nommé ainsi pour vous le dire. L'interface contient également un commentaire de documentation qui dit
Toutes les implémentations doivent intégrer UnimplementedMessageServiceServer pour une compatibilité ascendante.
L'idée est qu'un jour, les développeurs gRPC pourraient ajouter une nouvelle méthode à l'interface du serveur. S'ils font cela, ils intégreront également le type unimplemented
类型添加一个新方法,该方法返回“method Blah not Implemented”错误。由于您被迫将 unimplemented
dans votre type de serveur, vous hériterez donc de cette méthode et obtiendrez une implémentation par défaut qui génère une erreur, plutôt que de voir votre code échouer soudainement aux vérifications de type à cause de votre type de serveur. Nouvelles méthodes font défaut.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!