Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Jenis tidak boleh melaksanakan 'X' kerana ia mempunyai kaedah yang tidak dieksport dan ditakrifkan dalam pakej yang berbeza

Jenis tidak boleh melaksanakan 'X' kerana ia mempunyai kaedah yang tidak dieksport dan ditakrifkan dalam pakej yang berbeza

WBOY
WBOYke hadapan
2024-02-09 11:10:10443semak imbas

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!

Kandungan soalan

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

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam