Rumah > Artikel > pembangunan bahagian belakang > Jenis tidak boleh melaksanakan 'X' kerana ia mempunyai kaedah yang tidak dieksport dan ditakrifkan dalam pakej yang berbeza
editor php Yuzi, hello! Mengenai isu pelaksanaan jenis "X", kerana ia mempunyai kaedah yang tidak dieksport dan ditakrifkan dalam pakej yang berbeza, ia tidak boleh dilaksanakan secara langsung. Dalam PHP, kaedah dan sifat antara pakej yang berbeza tidak boleh diakses secara langsung. Jika anda ingin melaksanakan jenis "X", anda boleh mempertimbangkan untuk menggunakan antara muka atau warisan untuk melaksanakan fungsi yang diperlukan secara tidak langsung. Dapatkan kaedah dan sifat yang diperlukan dengan mentakrifkan antara muka dan melaksanakannya dalam kelas yang berbeza, atau dengan mewarisi. Ini membolehkan fungsi jenis "X" dilaksanakan dalam pakej yang berbeza. Harap ini membantu!
Saya ada kod ini:
s := grpc.newserver() pb.registermessageserviceserver(s, &messageserver{})
Saya mempunyai ralat ini:
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
Struktur pelayan mesej saya kelihatan seperti ini:
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 }
Ralat ada dalam baris ini:
pb.RegisterMessageServiceServer(s, &messageServer{}) // here
Tidak tahu apa yang sedang berlaku :(
Anda tidak sepatutnya memberikan mustEmbedUnimplementedMessageServiceServer()
的实现。您应该使您的服务器结构嵌入 UnimplementedMessageServiceServer
. Ahli dinamakan demikian untuk memberitahu anda perkara itu. Antara muka juga mempunyai ulasan dokumentasi yang mengatakan
Semua pelaksanaan mesti membenamkan UnimplementedMessageServiceServer untuk keserasian ke hadapan.
Ideanya ialah suatu hari nanti, pembangun gRPC mungkin menambah kaedah baharu pada antara muka pelayan. Jika mereka melakukan ini, mereka juga akan membenamkan jenis unimplemented
类型添加一个新方法,该方法返回“method Blah not Implemented”错误。由于您被迫将 unimplemented
ke dalam jenis pelayan anda, jadi anda akan mewarisi kaedah itu dan mendapat pelaksanaan lalai yang menimbulkan ralat, dan bukannya menyebabkan kod anda tiba-tiba mula gagal menyemak jenis kerana jenis pelayan anda Kaedah baharu kekurangan.
Atas ialah kandungan terperinci Jenis tidak boleh melaksanakan 'X' kerana ia mempunyai kaedah yang tidak dieksport dan ditakrifkan dalam pakej yang berbeza. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!