2014-11-25 78 views
23

有没有像Rubyawesome_printGolang漂亮的印刷golang变量

例如,在Ruby中,你可以写:

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

输出将是:

{ 
    "a" => 1, 
    "b" => 2 
} 
我能找到

最接近的事是Printf("%#v", x)

+2

I像[go-spew](https://github.com/davecgh/go-spew)。 – 2014-11-25 12:36:05

+2

如果外部软件包可以接受,请考虑[漂亮](http://godoc.org/github.com/kr/pretty#example-package)。 – Mark 2014-11-25 03:06:46

回答

45

如果你的目标是避免导入第三方包,你的其他选择是使用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

+0

测试多级缩进。 https://play.golang.org/p/d3nO4Rht90 – Xeoncross 2016-12-19 15:23:51

+0

当存在自定义结构(不受支持的类型错误)时,Marshal会引入麻烦。任何简单的方法来解决? – etang 2017-08-09 00:18:02

+0

@etang你将不得不为我演示一个简单的例子来给你一个更好的答案(也许在游乐场?)。我想如果你的类型变得复杂的话,你将不得不实现一个JSON包接口来解编你的类型。 – 2017-08-09 00:40:36

9

没关系,我找到了一个: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 
}