golang 是否提供了一种简单的方法来输出人类可读的 protobuf
Does golang provide an easy way to output human readable protobuf
有没有一种好的方法可以在 golang 中获得 protobuf 对象的人类可读字符串表示形式?相当于 https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message#Message.DebugString?
可以使用TextMarshaler。稍微修改示例原型:
p := &example.Test{
Label: proto.String("this"),
Reps: []int64{4, 3, 2, 1},
InnerTest: &example.Test_InnerTest{
InnerLabel: proto.String("is the end"),
},
}
t := proto.TextMarshaler{}
t.Marshal(os.Stdout, p)
输出:
label: "this"
reps: 4
reps: 3
reps: 2
reps: 1
inner_test: <
inner_label: "is the end"
>
我相信您正在寻找 proto.MarshalTextString。
p := &example.Test{
Label: proto.String("this"),
Reps: []int64{4, 3, 2, 1},
InnerTest: &example.Test_InnerTest{
InnerLabel: proto.String("is the end"),
},
}
fmt.Println(proto.MarshalTextString(p))
您可以在 Go 包中查看示例 test。
如果您需要将 PB 编组为结构化消息(在 JSON 中)供将来使用,您可以使用 MarshalToString。
一个简单的例子:
marshaler := &jsonpb.Marshaler{}
reqString, err := marshaler.MarshalToString(req)
log.Println("@@REQ@@", reqString)
或参考official unit test即可。
示例一:
package main
import "google.golang.org/protobuf/types/known/structpb"
func example1(x *structpb.Struct) string {
return x.String()
}
例子二:
package main
import (
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoimpl"
)
func example2(m proto.Message) string {
return protoimpl.X.MessageStringOf(m)
}
示例三:
package main
import (
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
)
func example3(m proto.Message) string {
return protojson.Format(m)
}
测试:
package main
import "google.golang.org/protobuf/types/known/structpb"
func main() {
m, err := structpb.NewStruct(map[string]interface{}{
"month": 12, "day": 31,
})
if err != nil {
panic(err)
}
println(example1(m))
println(example2(m))
println(example3(m))
}
结果:
fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
{
"day": 31,
"month": 12
}
有没有一种好的方法可以在 golang 中获得 protobuf 对象的人类可读字符串表示形式?相当于 https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message#Message.DebugString?
可以使用TextMarshaler。稍微修改示例原型:
p := &example.Test{
Label: proto.String("this"),
Reps: []int64{4, 3, 2, 1},
InnerTest: &example.Test_InnerTest{
InnerLabel: proto.String("is the end"),
},
}
t := proto.TextMarshaler{}
t.Marshal(os.Stdout, p)
输出:
label: "this"
reps: 4
reps: 3
reps: 2
reps: 1
inner_test: <
inner_label: "is the end"
>
我相信您正在寻找 proto.MarshalTextString。
p := &example.Test{
Label: proto.String("this"),
Reps: []int64{4, 3, 2, 1},
InnerTest: &example.Test_InnerTest{
InnerLabel: proto.String("is the end"),
},
}
fmt.Println(proto.MarshalTextString(p))
您可以在 Go 包中查看示例 test。
如果您需要将 PB 编组为结构化消息(在 JSON 中)供将来使用,您可以使用 MarshalToString。
一个简单的例子:
marshaler := &jsonpb.Marshaler{}
reqString, err := marshaler.MarshalToString(req)
log.Println("@@REQ@@", reqString)
或参考official unit test即可。
示例一:
package main
import "google.golang.org/protobuf/types/known/structpb"
func example1(x *structpb.Struct) string {
return x.String()
}
例子二:
package main
import (
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoimpl"
)
func example2(m proto.Message) string {
return protoimpl.X.MessageStringOf(m)
}
示例三:
package main
import (
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
)
func example3(m proto.Message) string {
return protojson.Format(m)
}
测试:
package main
import "google.golang.org/protobuf/types/known/structpb"
func main() {
m, err := structpb.NewStruct(map[string]interface{}{
"month": 12, "day": 31,
})
if err != nil {
panic(err)
}
println(example1(m))
println(example2(m))
println(example3(m))
}
结果:
fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
{
"day": 31,
"month": 12
}