【问题标题】:How to pretty print a Golang structure? [duplicate]如何漂亮地打印 Golang 结构? [复制]
【发布时间】:2019-10-08 01:37:54
【问题描述】:

我正在解组一个结构,我希望它以格式化的方式打印它。

我的代码 (https://play.golang.org/p/D0KwGP6Cxa0) 当前产生以下输出:

main.ADIStruct{CondensedADI:[]main.CondensedADI{main.CondensedADI{Name:"Type", Value:"title"}, main.CondensedADI{Name:"Title", Value:"Ste Life_S01_E10_"}, main.CondensedADI{Name:"Title_Brief", Value:"Ste Life_S01_E10_HD"}, main.CondensedADI{Name:"Episode_Name", Value:"Cody Goes to Camp"}, main.CondensedADI{Name:"Episode_ID", Value:"10"}, main.CondensedADI{Name:"Summary_Short", Value:"Zack is excited to finally get rid of his brother when Cody leaves for math camp."}, main.CondensedADI{Name:"Rating", Value:"TV-G"}, main.CondensedADI{Name:"Run_Time", Value:"00:22:50"}, main.CondensedADI{Name:"Display_Run_Time", Value:"00:23"}, main.CondensedADI{Name:"Year", Value:"2005"}, main.CondensedADI{Name:"Closed_Captioning", Value:"Y"}, main.CondensedADI{Name:"Genre", Value:"Family"}, main.CondensedADI{Name:"Billing_ID", Value:"00000"}, main.CondensedADI{Name:"Actors_Display", Value:"Ashley Tisdale ( Maddie ), Brenda Song ( London ), Cole Sprouse ( Cody ), Dylan Sprouse ( Zack ), Kim Rhodes ( Carey ), Phill Lewis ( Moseby )"}, main.CondensedADI{Name:"Licensing_Window_Start", Value:"2019-05-15 00:00:00"}, main.CondensedADI{Name:"Licensing_Window_End", Value:"2019-10-31 00:00:00"}, main.CondensedADI{Name:"Preview_Period", Value:"0"}, main.CondensedADI{Name:"Display_As_New", Value:"7"}, main.CondensedADI{Name:"Display_As_Last_Chance", Value:"7"}, main.CondensedADI{Name:"Provider_QA_Contact", Value:"DATG.DL-VOD.Support@disney.com"}, main.CondensedADI{Name:"Suggested_Price", Value:"0.00"}, main.CondensedADI{Name:"Category", Value:"Disney Channel HD/Suite Life"}}}

我希望它只有名称和值,并且在每个项目之后都有一个新行。比如这样:

Name:"Type", Value:"title"

Name:"Title", Value:"Ste Life_S01_E10_"

有什么想法可以做到吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    Go 标准库中有一个函数采用 interface{} 并生成缩进的 JSON 输出:json.MarshalIndent

    这是一个如何将其应用于您的用例 (https://play.golang.org/p/3geUEEHESSa) 的示例:

    s, _ := json.MarshalIndent(b, "", "\t")
    fmt.Print(string(s))
    

    虽然不完全符合您的预期,但这会产生一个可读性很强的 JSON 输出:

    {
        "CondensedADI": [
            {
                "Name": "Type",
                "Value": "title"
            },
            {
                "Name": "Title",
                "Value": "Ste Life_S01_E10_"
            },
            ...
    

    【讨论】:

    • 这很好用!最后一个问题。如果我想排除某些 JSON 名称,例如“类型”或“标题”,有没有简单的方法可以做到这一点?
    • 我不确定这个,我会挖掘这个话题。与此同时,您应该创建一个新问题以最大限度地提高知名度。
    • JSON 编组会丢失很多关于 Go 结构的信息,并且不适用于所有数据类型,因此通常是这类事情的糟糕选择。
    • 我的建议取决于您的用例。对于调试,spew 是一个不错的选择。如果您正在转储数据以供最终用户使用,您甚至可能需要使用 HTML 或其他内容对其进行标记。所以这完全取决于。
    【解决方案2】:

    这可能是重复问题的重复答案,但 json.MarshalIndent() 的一个很好的替代方法是使用 go-spew,这将为您提供更多详细信息和格式选项:https://github.com/davecgh/go-spew

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多