Heim  >  Artikel  >  Backend-Entwicklung  >  Der Typ kann „X“ nicht implementieren, da er über nicht exportierte Methoden verfügt und in einem anderen Paket definiert ist

Der Typ kann „X“ nicht implementieren, da er über nicht exportierte Methoden verfügt und in einem anderen Paket definiert ist

WBOY
WBOYnach vorne
2024-02-09 11:10:10438Durchsuche

Der Typ kann „X“ nicht implementieren, da er über nicht exportierte Methoden verfügt und in einem anderen Paket definiert ist

php-Editor Yuzu, hallo! Was das Problem der Implementierung des Typs „X“ betrifft, so kann er nicht direkt implementiert werden, da er über nicht exportierte Methoden verfügt und in einem anderen Paket definiert ist. In PHP kann nicht direkt auf Methoden und Eigenschaften zwischen verschiedenen Paketen zugegriffen werden. Wenn Sie den Typ „X“ implementieren möchten, können Sie die Verwendung von Schnittstellen oder Vererbung in Betracht ziehen, um die erforderliche Funktionalität indirekt zu implementieren. Erhalten Sie die erforderlichen Methoden und Eigenschaften, indem Sie eine Schnittstelle definieren und in verschiedenen Klassen implementieren oder durch Vererbung. Dies ermöglicht die Implementierung der Funktionalität vom Typ „X“ in verschiedenen Paketen. Hoffe das hilft!

Frageninhalt

Ich habe diesen Code:

s := grpc.newserver()
pb.registermessageserviceserver(s, &messageserver{})

Ich habe diesen Fehler:

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

Meine Messageserver-Struktur sieht so aus:

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
}

Der Fehler liegt in dieser Zeile:

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

Keine Ahnung, was los ist :(

Workaround

Sie sollten mustEmbedUnimplementedMessageServiceServer() 的实现。您应该使您的服务器结构嵌入 UnimplementedMessageServiceServer nicht angeben. Das Mitglied wird so benannt, um Ihnen das zu sagen. Die Schnittstelle hat auch einen Dokumentationskommentar mit der Aufschrift

Alle Implementierungen müssen UnimplementedMessageServiceServer aus Gründen der Vorwärtskompatibilität einbetten.

Die Idee ist, dass gRPC-Entwickler eines Tages möglicherweise eine neue Methode zur Serverschnittstelle hinzufügen. Wenn sie dies tun, betten sie auch den Typ unimplemented 类型添加一个新方法,该方法返回“method Blah not Implemented”错误。由于您被迫将 unimplemented in Ihren Servertyp ein, sodass Sie diese Methode erben und eine Standardimplementierung erhalten, die einen Fehler auslöst, anstatt dass Ihr Code aufgrund der neuen Methoden Ihres Servertyps plötzlich bei Typprüfungen fehlschlägt fehlen.

Das obige ist der detaillierte Inhalt vonDer Typ kann „X“ nicht implementieren, da er über nicht exportierte Methoden verfügt und in einem anderen Paket definiert ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen