Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mesej Protobuf tidak melaksanakan protoreflect.ProtoMessage (kaedah ProtoReflect mempunyai penerima penunjuk)

Mesej Protobuf tidak melaksanakan protoreflect.ProtoMessage (kaedah ProtoReflect mempunyai penerima penunjuk)

WBOY
WBOYke hadapan
2024-02-09 18:27:20521semak imbas

Mesej Protobuf tidak melaksanakan protoreflect.ProtoMessage (kaedah ProtoReflect mempunyai penerima penunjuk)

editor php Xinyi di sini untuk memperkenalkan masalah kepada anda: dalam mesej Protobuf, kami mendapati bahawa kaedah ProtoReflect antara muka protoreflect.ProtoMessage tidak dilaksanakan, dan kaedah ini menggunakan penerima penuding. Soalan ini boleh menyebabkan sedikit kekeliruan dan kesulitan. Dalam artikel ini, kami akan menyelidiki punca dan kemungkinan penyelesaian untuk masalah ini untuk membantu anda memahami dan menangani masalah ini dengan lebih baik. Mari kita ketahui bersama!

Kandungan soalan

Saya ada mesej protobuf yang diimport "google/protobuf/any.proto":

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

Saya cuba menggunakan anypb untuk bersiri dataprotobuf lain di dalam medan:

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
}

Ralat berikut berlaku selepas penyusunan:

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)

Menurut dokumentasi, saya tidak melakukan perkara luar biasa di sini. Bagaimanakah saya boleh menyelesaikan masalah ini?

Ini adalah protobuf yang saya cuba sirikan dan simpan di dalam medan 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;
}

Penyelesaian

sarath sadasivan pilai betul.
Tukar kod anda kepada:

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

Atas ialah kandungan terperinci Mesej Protobuf tidak melaksanakan protoreflect.ProtoMessage (kaedah ProtoReflect mempunyai penerima penunjuk). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam