如何漂亮地打印 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 数据