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

WBOY
Freigeben: 2024-02-09 11:10:10
nach vorne
443 Leute haben es durchsucht

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{})
Nach dem Login kopieren

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
Nach dem Login kopieren

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
}
Nach dem Login kopieren

Der Fehler liegt in dieser Zeile:

pb.RegisterMessageServiceServer(s, &messageServer{}) // here
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage