【发布时间】: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)
【问题讨论】:
标签: go pretty-print
在 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)
【问题讨论】:
标签: go pretty-print
没关系,我找到了一个: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
}
【讨论】:
如果您的目标是避免导入第三方包,您的另一个选择是使用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
}
【讨论】:
我想像这样使用 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 调用和所有这些连接。
我刚刚根据 Simons 的回答写了一个简单的函数:
func dump(data interface{}){
b,_:=json.MarshalIndent(data, "", " ")
fmt.Print(string(b))
}
【讨论】:
【讨论】: