如何在golang使用protobuf.any

如何在golang使用protobuf.any,go,protocol-buffers,Go,Protocol Buffers,我在我的围棋项目中使用grpc。代码如下: 示例.proto: syntax = "proto3"; message Example { string message = 1; google.protobuf.Any details = 2; } 梅因,加油 func logMessage (m string, d interface{}) { message := & example.message{ message: m

我在我的围棋项目中使用grpc。代码如下:

示例.proto:

syntax = "proto3";

message Example {
    string message = 1;
    google.protobuf.Any details = 2;
}

梅因,加油

func logMessage (m string, d interface{}) {
    message := & example.message{
       message: m,
       details: ??
    }    
    log(&message)
}

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

该软件包具有将任意原始消息转换为以下任意消息的实用程序:


:

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

封送Any将给定消息m封送为anypb.Any消息


:

func UnmarshalAny(any*anypb.any,m proto.Message)错误

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


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

func日志消息(m字符串,d协议消息){
详细信息,错误:=ptypes.marshallany(d)
如果错误!=零{
恐慌(错误)
}
message:=&example.message{
信息:m,
详情:详情
}    
日志(&消息)
}

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

导入(
“google.golang.org/protobuf/types/known/anypb”
“github.com/golang/protobuf/ptypes/any”
)
func Unmarshal(数据*any.any)(*YourMessage,err){
我是你的信息
err:=anypb.UnmarshalTo(数据,&m,proto.unmarshaltoptions{})
返回&m,err
}

但目前,
d
只是一个
接口{}
而不是
协议消息
。这是不是意味着我需要先把它做成一个原始信息?如果是,我该怎么做?最终,
protobuf.任何
都必须是proto.Message。您可以直接传递一个,也可以执行类型断言。例如:
d.(proto.Message)
git中有完整的代码示例吗?