Golang中是否有类似Rubyawesome_print的东西?

例如,在ruby中,您可以编写:

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

输出将是:

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

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

  • 如果可以接受外部包装,请考虑使用。
  • 我喜欢喷鼻涕。

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

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

输出:

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

工作示例:http://play.golang.org/p/SNdn7DsBjy

  • 测试多个缩进级别。 play.golang.org/p/d3nO4Rht90
  • 当存在自定义结构(不支持的类型错误)时,元帅会遇到入门麻烦。 有任何简单的方法可以解决此问题?
  • @etang您必须为我提供一个简单的示例,以便为您提供更好的答案(也许在操场上?)。 我想您必须实现JSON包接口之一才能在类型变得复杂时将其解组。

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

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

将给出输出:

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

我上来使用这样的代码段:

1
2
3
4
5
6
7
8
9
10
11
12
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)
    }
}

输出将如下所示:

1
2
short_key:       value1
really_long_key: value2

告诉我,是否有一些更简单的方法可以进行相同的对齐。

  • 您可以使用fmt.Printf("%*s: %s", maxLenKey, k, v)避免strings.Repeat调用和所有此类串联。