Maison >développement back-end >Golang >Les messages Protobuf n'implémentent pas protoreflect.ProtoMessage (la méthode ProtoReflect a un récepteur de pointeur)

Les messages Protobuf n'implémentent pas protoreflect.ProtoMessage (la méthode ProtoReflect a un récepteur de pointeur)

WBOY
WBOYavant
2024-02-09 18:27:20578parcourir

Les messages Protobuf nimplémentent pas protoreflect.ProtoMessage (la méthode ProtoReflect a un récepteur de pointeur)

L'éditeur php Xinyi est là pour vous présenter un problème : dans le message Protobuf, nous avons constaté que la méthode ProtoReflect de l'interface protoreflect.ProtoMessage n'est pas implémentée, et cette méthode utilise un récepteur de pointeur. Cette question peut causer une certaine confusion et des désagréments. Dans cet article, nous examinerons les causes et les solutions possibles à ce problème pour vous aider à mieux comprendre et gérer ce problème. Découvrons-le ensemble !

Contenu de la question

J'ai un message protobuf importé "google/protobuf/any.proto" :

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

J'essaie d'utiliser anypb pour sérialiser dataun autre protobuf à l'intérieur d'un champ :

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
}

L'erreur suivante se produit après la compilation :

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)

D'après la documentation, je ne fais rien d'extraordinaire ici. Comment puis-je résoudre ce problème?

Voici le protobuf que j'essaie de sérialiser et de stocker dans le champ data : 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;
}

Solution

sarath sadasivan pillai est correcte.
Changez votre code en :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer