4 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
由于 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
}

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
protobuf/ptypes包具有將任意 proto 消息轉(zhuǎn)換為任意 proto 消息的實(shí)用程序:
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 中。如果目標(biāo)消息與 Any 消息中的類型不匹配或發(fā)生解組錯(cuò)誤,則返回錯(cuò)誤。
在您的示例中,您將使用以下內(nèi)容:
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)
}

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
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 函數(shù)

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
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;
}
- 4 回答
- 0 關(guān)注
- 1510 瀏覽
添加回答
舉報(bào)