【问题标题】:Does golang provide an easy way to output human readable protobufgolang 是否提供了一种简单的方法来输出人类可读的 protobuf
【发布时间】:2016-02-19 21:33:05
【问题描述】:

有没有一种好方法可以在 golang 中获得人类可读的 protobuf 对象的字符串表示形式?相当于https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message#Message.DebugString的东西?

我正在使用https://github.com/golang/protobuf

【问题讨论】:

  • 您是否可以解组对象,或者当它仍然是一个 profobuf 消息时,您是否需要打印它?你也在用这个包吗? github.com/golang/protobuf
  • 是的,我已将其解组(一个 proto.Message 对象,而不是字符串/字节 [])。我更喜欢使用 proto.Message,但这不是必需的。我正在使用那个库。
  • 希望我能给你一个答案,因为我确信这是可能的,但我已经有大约一年没有使用这个包了,也没有时间去挖掘它的来源。
  • 你使用的是哪个 protobuf 实现?
  • github.com/golang/protobuf - 也更新了问题

标签: go protocol-buffers


【解决方案1】:

我相信你正在寻找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 中查看示例。

【讨论】:

    【解决方案2】:

    您可以使用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"
    >
    

    【讨论】:

      【解决方案3】:

      示例一:

      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
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用MarshalToString,如果您需要将您的 PB 编组为结构化消息(以 JSON 格式)以供将来使用。

        一个简单的例子:

        marshaler := &jsonpb.Marshaler{}
        reqString, err := marshaler.MarshalToString(req)
        log.Println("@@REQ@@", reqString)
        

        或者参考official unit test就可以了。

        【讨论】:

          猜你喜欢
          • 2010-10-30
          • 2016-12-26
          • 1970-01-01
          • 2020-11-17
          • 2016-09-24
          • 1970-01-01
          • 1970-01-01
          • 2012-12-03
          • 1970-01-01
          相关资源
          最近更新 更多