Heim  >  Artikel  >  Backend-Entwicklung  >  Protobuf-Nachrichten implementieren protoreflect.ProtoMessage nicht (die ProtoReflect-Methode verfügt über einen Zeigerempfänger)

Protobuf-Nachrichten implementieren protoreflect.ProtoMessage nicht (die ProtoReflect-Methode verfügt über einen Zeigerempfänger)

WBOY
WBOYnach vorne
2024-02-09 18:27:20525Durchsuche

Protobuf-Nachrichten implementieren protoreflect.ProtoMessage nicht (die ProtoReflect-Methode verfügt über einen Zeigerempfänger)

php-Editor Xinyi ist hier, um Ihnen ein Problem vorzustellen: In der Protobuf-Nachricht haben wir festgestellt, dass die ProtoReflect-Methode der protoreflect.ProtoMessage-Schnittstelle nicht implementiert ist und diese Methode einen Zeigerempfänger verwendet. Diese Frage kann zu Verwirrung und Unannehmlichkeiten führen. In diesem Artikel werden wir uns mit den Ursachen und möglichen Lösungen für dieses Problem befassen, um Ihnen zu helfen, dieses Problem besser zu verstehen und damit umzugehen. Finden wir es gemeinsam heraus!

Frageninhalt

Ich habe eine Protobuf-Nachricht importiert "google/protobuf/any.proto":

message mintrecord {
    ...
    google.protobuf.any data = 11;
    ...
}

Ich versuche, Anypb zu verwenden, um dataeinen weiteren Protobuf innerhalb eines Feldes zu serialisieren:

data, err := anypb.new(protobuf.lootcrateprize{
    items: &protobuf.inventory{items: items},
    roll:  fmt.sprintf("%f", roll),
})
if err != nil {
    log.println("[lootbox] err: error marshalling lootcrate prize data into mintrec", err)
} else {
    mintrecordproto.data = data
}

Der folgende Fehler tritt nach der Kompilierung auf:

cannot use protobuf.lootcrateprize{…} (value of type protobuf.lootcrateprize) as type protoreflect.protomessage in argument to anypb.new:
    protobuf.lootcrateprize does not implement protoreflect.protomessage (protoreflect method has pointer receiver)

Laut Dokumentation mache ich hier nichts Ungewöhnliches. Wie kann ich dieses Problem lösen?

Dies ist der Protobuf, den ich zu serialisieren und im data-Feld zu speichern versuche: lootcrate.proto:

syntax = "proto3";

package protobuf;
option go_package = "protobuf/";

import "protobuf/inventory.proto";
import "protobuf/flowerdbservice.proto";

message LootcratePrize {
    Inventory items = 1;
    repeated NFT flowers = 2;
    string roll = 3;
}

Lösung

sarath sadasivan pillai ist richtig.
Ändern Sie Ihren Code in:

data, err := anypb.New(&protobuf.LootcratePrize{
    Items: &protobuf.Inventory{Items: items},
    Roll:  fmt.Sprintf("%f", roll),
})

Das obige ist der detaillierte Inhalt vonProtobuf-Nachrichten implementieren protoreflect.ProtoMessage nicht (die ProtoReflect-Methode verfügt über einen Zeigerempfänger). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen