首頁  >  文章  >  後端開發  >  類型無法實現“X”,因為它具有非導出方法並且是在不同的套件中定義的

類型無法實現“X”,因為它具有非導出方法並且是在不同的套件中定義的

WBOY
WBOY轉載
2024-02-09 11:10:10438瀏覽

類型無法實現“X”,因為它具有非導出方法並且是在不同的套件中定義的

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除