2 回答

TA貢獻1772條經驗 獲得超5個贊
如您所知,是消息類型,因此當您沒有為其設置任何值時,它將為零。google.protobuf.Any
您必須使用您的結構取消封送數據,請參閱下面來自 protobuf 示例的代碼
// marshal any
foo := &pb.Foo{...}
any, err := anypb.New(foo)
if err != nil {
...
}
// unmarshal any
foo := &pb.Foo{}
if err := any.UnmarshalTo(foo); err != nil {
...
}
或者我認為你可以用它與指針接口(&接口{})一起使用,如下所示:
d := &interface{}{}
if err := endorsement.Data.UnmarshalTo(d); err != nil {
...
}

TA貢獻1818條經驗 獲得超7個贊
從軟件包1 文檔取消編組任何:
UnmarshalNew
使用全局類型注冊表解析消息類型,并構造該消息的新實例以取消編組。為了使消息類型顯示在全局注冊表中,必須將表示該 protobuf 消息類型的 Go 類型鏈接到 Go 二進制文件中。對于由原始生成生成的消息,這是通過導入表示 .proto 文件的生成的 Go 包來實現的。
注冊表的類型為 。類型查找是使用字段完成的,該字段在封送原始消息時由 gRPC 客戶端設置為具體類型的 url。protoregistry.GlobalTypes
Any.TypeUrl
令人困惑的細節是,它可以是任何原始緩沖區消息,但該原始緩沖區消息必須在某個地方定義。Any
您的文件沒有與輸入中的對象匹配的消息定義。可能是此消息在其他地方定義(不在您自己的原型文件中),但無論如何,您都必須導入生成的消息所在的Go包。.proto
data
Data
否則,如果輸入不是來自已定義的原型消息,您可以自己向原型添加消息定義,然后使用 UnmarshalTo
:
// proto file
message Data {
string type = 1;
int user_id = 2;
Transaction transaction = 3;
}
message Transaction {
float amount = 1;
}
然后:
for _, endorsement := range txnPayload.Endorsements {
data := generated.Data{}
err := endorsement.Data.UnmarshalTo(&data)
if err != nil {
log.Print("Error while unmarshaling the endorsement")
}
}
如果您只需要任意的字節序列,即真正未知的類型,請使用原型類型并將其視為 JSON 有效負載。bytes
將其建模為 Go 結構:
type Data struct {
Type string `json:"type"`
UserID int `json:"userId"`
Transaction struct{
Amount float64 `json:"amount"`
} `json:"transaction"`
}
或者,如果客戶可以發送任何東西。map[string]interface{}
然后在您的處理程序功能中:
for _, endorsement := range txnPayload.Endorsements {
data := Data{} // or `map[string]interface{}`
err := json.Unmarshal(endorsement.Data, &data)
if err != nil {
log.Print("Error while unmarshaling the endorsement")
}
}
- 2 回答
- 0 關注
- 189 瀏覽
添加回答
舉報