jas*_*135 5 go protocol-buffers
我在我的 go 项目中使用 grpc。下面是代码:
示例.proto:
syntax = "proto3";
message Example {
string message = 1;
google.protobuf.Any details = 2;
}
Run Code Online (Sandbox Code Playgroud)
main.go
func logMessage (m string, d interface{}) {
message := & example.message{
message: m,
details: ??
}
log(&message)
}
Run Code Online (Sandbox Code Playgroud)
但我不确定如何处理 details(interface{}) 字段。我知道我可以使用任何类型的接口,但不确定如何在这里使用它。任何人都可以帮忙吗?谢谢
igo*_*shi 13
由于 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
}
Run Code Online (Sandbox Code Playgroud)
所述的protobuf / ptypes封装具有实用程序转换为从任意的原消息以任何/:
元帅任何:
func MarshalAny(m proto.Message) (*anypb.Any, error)
MarshalAny 将给定的消息 m 编组为 anypb.Any 消息。
解组任何:
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6559 次 |
| 最近记录: |