【问题标题】:How to pretty print variables如何漂亮地打印变量
【发布时间】:2015-01-22 22:27:57
【问题描述】:

在 Go 中有类似 Ruby 的 awesome_print 的东西吗?

例如在 Ruby 中你可以这样写:

require 'ap'
x = {a:1,b:2} // also works for class
ap x

输出将是:

{ 
  "a" => 1,
  "b" => 2
}

我能找到的最接近的东西是Printf("%#v", x)

【问题讨论】:

  • 如果可以接受外部包,请考虑pretty
  • 我喜欢go-spew

标签: go pretty-print


【解决方案1】:

没关系,我找到了一个:https://github.com/davecgh/go-spew

// import "github.com/davecgh/go-spew/spew"
x := map[string]interface{}{"a":1,"b":2}
spew.Dump(x)

会给出一个输出:

(map[string]interface {}) (len=2) {
 (string) (len=1) "a": (int) 1,
 (string) (len=1) "b": (int) 2
}

【讨论】:

    【解决方案2】:

    如果您的目标是避免导入第三方包,您的另一个选择是使用json.MarshalIndent

    x := map[string]interface{}{"a": 1, "b": 2}
    b, err := json.MarshalIndent(x, "", "  ")
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Print(string(b))
    

    输出:

    {
        "a": 1,
        "b": 2
    }
    

    工作样本:http://play.golang.org/p/SNdn7DsBjy

    【讨论】:

    • 测试多个缩进级别。 play.golang.org/p/d3nO4Rht90
    • 当存在自定义结构(不支持的类型错误)时,Marshal 会遇到介绍问题。有什么简单的方法可以解决吗?
    • @etang 你必须展示一个简单的例子让我给你一个更好的答案(也许在操场上?)。我想如果它变得复杂,你将不得不实现其中一个 JSON 包接口来解组你的类型。
    【解决方案3】:

    我想像这样使用 sn-p:

    func printMap(m map[string]string) {
        var maxLenKey int
        for k, _ := range m {
            if len(k) > maxLenKey {
                maxLenKey = len(k)
            }
        }
    
        for k, v := range m {
            fmt.Println(k + ": " + strings.Repeat(" ", maxLenKey - len(k)) + v)
        }
    }
    

    输出将是这样的:

    short_key:       value1
    really_long_key: value2
    

    告诉我,如果有更简单的方法来做同样的对齐。

    【讨论】:

    • 您可以使用fmt.Printf("%*s: %s", maxLenKey, k, v) 来避免strings.Repeat 调用和所有这些连接。
    【解决方案4】:

    我刚刚根据 Simons 的回答写了一个简单的函数:

    func dump(data interface{}){
        b,_:=json.MarshalIndent(data, "", "  ")
        fmt.Print(string(b))
    }
    

    【讨论】:

      【解决方案5】:

      如果你想要漂亮的彩色输出,你可以使用pp

      https://github.com/k0kubun/pp

      import "github.com/k0kubun/pp"
      ...
      pp.Print(m)
      

      【讨论】:

      • 漂亮的印刷品很好
      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2012-10-08
      • 2011-02-04
      • 2011-07-28
      • 2015-02-07
      • 2016-01-02
      相关资源
      最近更新 更多