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

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

WBOY
WBOYavant
2024-02-09 11:10:10438parcourir

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!

Contenu de la question

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 :(

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer