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

WBOY
Freigeben: 2024-02-09 18:27:20
nach vorne
523 Leute haben es durchsucht

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;
    ...
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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),
})
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!