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

WBOY
Lepaskan: 2024-02-09 11:10:10
ke hadapan
444 orang telah melayarinya

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{})
Salin selepas log masuk

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
Salin selepas log masuk

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
}
Salin selepas log masuk

Ralat ada dalam baris ini:

pb.RegisterMessageServiceServer(s, &messageServer{}) // here
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan