2014-11-25 14 views
23

Gibt es so etwas wie Ruby 's awesome_print in Golang?Ziemlich Drucken Golang Variable

Zum Beispiel in Ruby Sie schreiben können:

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

die Ausgabe wäre:

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

nächste Sache, die ich gefunden konnte Printf("%#v", x)

+2

I wie [go-spew] (https://github.com/davecgh/go-spew). –

+2

Wenn ein externes Paket akzeptabel ist, betrachten Sie [pretty] (http://godoc.org/github.com/kr/pretty#example-package). – Mark

Antwort

45

Wenn Ihr Ziel ist ein Drittanbieter-Paket importieren, Ihre andere Möglichkeit ist die Verwendung json.MarshalIndent zu vermeiden ist:

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

Ausgang:

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

Arbeitsprobe: http://play.golang.org/p/SNdn7DsBjy

+0

Testen mehrerer Ebenen von Einrückung. https://play.golang.org/p/d3nO4Rht90 – Xeoncross

+0

Marshal bekommt Intro Probleme, wenn es eine benutzerdefinierte Struktur (nicht unterstützten Typ Fehler) gibt. Eine einfache Möglichkeit, das zu beheben? – etang

+0

@etang Sie müssten mir ein einfaches Beispiel zeigen, um Ihnen eine bessere Antwort zu geben (vielleicht auf dem Spielplatz?). Ich kann mir vorstellen, dass Sie eine der JSON-Paketschnittstellen implementieren müssen, um Ihren Typ zu entpacken, wenn er komplex wird. –

9

Nevermind ist, fand ich ein: https://github.com/davecgh/go-spew

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

Würde eine Ausgabe geben:

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