php小編柚子,你好!關於實作"X"類型的問題,由於它具有非導出方法並且是在不同的套件中定義的,所以無法直接實作。在PHP中,不同的套件之間的方法和屬性是無法直接存取的。如果要實現"X"類型,可以考慮使用介面或繼承間接實現所需的功能。透過定義介面並在不同的類別中實現它,或透過繼承來取得所需的方法和屬性。這樣就能夠在不同的套件中實現"X"類型的功能。希望對你有幫助!
我有這個程式碼:
s := grpc.newserver() pb.registermessageserviceserver(s, &messageserver{})
我有這個錯誤:
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
我的 messageserver 結構如下所示:
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 }
錯誤在這一行:
pb.RegisterMessageServiceServer(s, &messageServer{}) // here
不知道發生了什麼:(
您不應該提供mustEmbedUnimplementedMessageServiceServer()
的實作。您應該讓您的伺服器結構嵌入UnimplementedMessageServiceServer
。該成員如此命名就是為了告訴您這一點。該介面還有一個文檔註釋,上面寫著
所有實作都必須嵌入 UnimplementedMessageServiceServer 以實現向前相容性。
這個想法是,有一天,gRPC 開發人員可能會為伺服器介面添加一種新方法。如果他們這樣做,他們還將向 unimplemented
類型添加一個新方法,該方法會傳回「method Blah not Implemented」錯誤。由於您被迫將unimplemented
類型嵌入您的伺服器類型中,因此您將繼承該方法,並獲得引發錯誤的預設實現,而不是讓您的程式碼突然開始失敗類型檢查,因為您的伺服器類型缺少新方法。
以上是類型無法實現'X”,因為它具有非導出方法並且是在不同的套件中定義的的詳細內容。更多資訊請關注PHP中文網其他相關文章!