Home >Backend Development >Golang >Protobuf messages do not implement protoreflect.ProtoMessage (ProtoReflect method has pointer receiver)

Protobuf messages do not implement protoreflect.ProtoMessage (ProtoReflect method has pointer receiver)

WBOY
WBOYforward
2024-02-09 18:27:20573browse

Protobuf messages do not implement protoreflect.ProtoMessage (ProtoReflect method has pointer receiver)

php editor Xinyi is here to introduce a problem: in the Protobuf message, we found that the ProtoReflect method of the protoreflect.ProtoMessage interface is not implemented, and this method uses pointer reception device. This question may cause some confusion and inconvenience. In this article, we will delve into the causes and possible solutions to this problem to help you better understand and deal with this problem. Let’s find out together!

Question content

I have a protobuf message imported "google/protobuf/any.proto":

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

I'm trying to use anypb to serialize another protobuf inside the data field:

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
}

The following error occurs after 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)

According to the documentation, I'm not doing anything unusual here. How can I solve this problem?

This is the protobuf I try to serialize and store inside the data field: 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 is correct.
Change your code to:

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

The above is the detailed content of Protobuf messages do not implement protoreflect.ProtoMessage (ProtoReflect method has pointer receiver). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete