如何在 golang 中使用 protobuf.any

我在我的 go 项目中使用 grpc。下面是代码:


example.proto:


syntax = "proto3";


message Example {

    string message = 1;

    google.protobuf.Any details = 2;

}


main.go


func logMessage (m string, d interface{}) {

    message := & example.message{

       message: m,

       details: ??

    }    

    log(&message)

}


但我不确定如何处理 details(interface{}) 字段。我知道我可以使用任何类型的接口,但不知道如何在这里使用它。任何人都可以帮忙吗?谢谢


繁华开满天机
浏览 1371回答 4
4回答

慕侠2389804

由于 protobuf/ptypes 已被弃用,因此值得使用anypb.UnmarshalToimport (    "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}

慕姐4208626

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) errorUnmarshalAny 将包含在 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)}

侃侃无极

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 函数

饮歌长啸

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;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go