为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中使用 protobuf.any

如何在 golang 中使用 protobuf.any

Go
繁华开满天机 2022-07-04 10:09:27
我在我的 go 项目中使用 grpc。下面是代码:example.proto:syntax = "proto3";message Example {    string message = 1;    google.protobuf.Any details = 2;}main.gofunc logMessage (m string, d interface{}) {    message := & example.message{       message: m,       details: ??    }        log(&message)}但我不确定如何处理 details(interface{}) 字段。我知道我可以使用任何类型的接口,但不知道如何在这里使用它。任何人都可以帮忙吗?谢谢
查看完整描述

4 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

由于 protobuf/ptypes 已被弃用,因此值得使用anypb.UnmarshalTo


import (

    "google.golang.org/protobuf/types/known/anypb"

    "github.com/golang/protobuf/ptypes/any"

)


func Unmarshal(data *any.Any) (*YourMessage, err) {

    var m YourMessage

    err := anypb.UnmarshalTo(data, &m, proto.UnmarshalOptions{})

    return &m,err

}


查看完整回答
反对 回复 2022-07-04
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

protobuf/ptypes包具有将任意 proto 消息转换为任意 proto 消息的实用程序:


MarshalAny:


func MarshalAny(m proto.Message) (*anypb.Any, error)


MarshalAny 将给定的消息 m 编组为 anypb.Any 消息。


UnmarshalAny:


func UnmarshalAny(any *anypb.Any, m proto.Message) error


UnmarshalAny 将包含在 anypb.Any 消息中的编码值解组到提供的消息 m 中。如果目标消息与 Any 消息中的类型不匹配或发生解组错误,则返回错误。


在您的示例中,您将使用以下内容:


func logMessage (m string, d proto.Message) {

    details, err := ptypes.MarshalAny(d)

    if err != nil {

        panic(err)

    }

    message := & example.message{

        message: m,

        details: details

    }    

    log(&message)

}


查看完整回答
反对 回复 2022-07-04
?
侃侃无极

TA贡献2051条经验 获得超10个赞

func pbany(v interface{}) (*anypb.Any, error) {

pv, ok := v.(proto.Message)

if !ok {

    return &anypb.Any{}, fmt.Errorf("%v is not proto.Message", pv)

}

return anypb.New(pv)

使用anypb.Newapi,在您的代码中,传递d给 pbany 函数


查看完整回答
反对 回复 2022-07-04
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

func interfaceToAny(v interface{}) (*anypb.Any, error) {

    bytes, err := json.Marshal(v)

    if err != nil {

        println("error json.Marshal interfaceToAny")

        return nil, err

    }

    m := api.Bytes{B: bytes}

    return anypb.New(&m)

}


message Bytes {

  bytes b = 1;

}


查看完整回答
反对 回复 2022-07-04
  • 4 回答
  • 0 关注
  • 1370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信