如何在golang使用protobuf.any
我在我的围棋项目中使用grpc。代码如下: 示例.proto:如何在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
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中有完整的代码示例吗?