如何漂亮地打印 Golang 结构? [复制]

Posted

技术标签:

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

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

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

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

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

Name:"Type", Value:"title"

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

有什么想法可以做到吗?

【问题讨论】:

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

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

【讨论】:

以上是关于如何漂亮地打印 Golang 结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

goutil/dump —— 打印漂亮且易于阅读的 Go 数据

如何有效地漂亮打印 JSON 对象列表? [复制]

如何以 json 格式(双引号)漂亮地打印(人类可读的打印)Python dict? [复制]

Golang操作数据库Redis

如何漂亮地打印嵌套字典?

如果通过 Golang 通道发送,结构是不是实际上在 goroutine 之间复制?