716 Stimmen

Wie druckt man Strukturvariablen in der Konsole aus?

Wie kann ich (auf der Konsole) das Id, Title, Name, usw. dieser Struktur in Golang ausgeben?

type Project struct {
    Id      int64   `json:"project_id"`
    Title   string  `json:"title"`
    Name    string  `json:"name"`
    Data    Data    `json:"data"`
    Commits Commits `json:"commits"`
}

1214voto

VonC Punkte 1117238

Um den Namen der Felder in einer Struktur zu drucken:

fmt.Printf("%+v\n", yourProject)

Aus dem fmt Paket:

beim Drucken von Strukturen fügt die Plus-Flagge (%+v) Feldnamen hinzu

Dies setzt voraus, dass Sie eine Instanz von Project haben (in 'yourProject')

Der Artikel JSON und Go enthält weitere Details dazu, wie man die Werte aus einer JSON-Struktur abruft.


Diese Go by Example Seite bietet eine weitere Technik:

type Response2 struct {
  Page   int      `json:"page"`
  Fruits []string `json:"fruits"`
}

res2D := &Response2{
    Page:   1,
    Fruits: []string{"apple", "peach", "pear"}}
res2B, _ := json.Marshal(res2D)
fmt.Println(string(res2B))

Dies würde gedruckt werden:

{"page":1,"fruits":["apple","peach","pear"]}

Wenn Sie keine Instanz haben, dann müssen Sie Reflexion verwenden, um den Namen des Feldes einer gegebenen Struktur anzuzeigen, wie in diesem Beispiel.

type T struct {
    A int
    B string
}

t := T{23, "skidoo"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()

for i := 0; i < s.NumField(); i++ {
    f := s.Field(i)
    fmt.Printf("%d: %s %s = %v\n", i,
        typeOfT.Field(i).Name, f.Type(), f.Interface())
}

215voto

Martin Olika Punkte 2033

Ich möchte go-spew empfehlen, das laut ihrem Github "Einen tiefgreifenden hübschen Drucker für Go-Datenstrukturen implementiert, um beim Debuggen zu helfen"

go get -u github.com/davecgh/go-spew/spew

Verwendungsbeispiel:

package main

import (
    "github.com/davecgh/go-spew/spew"
)

type Project struct {
    Id      int64  `json:"project_id"`
    Title   string `json:"title"`
    Name    string `json:"name"`
    Data    string `json:"data"`
    Commits string `json:"commits"`
}

func main() {

    o := Project{Name: "hello", Title: "world"}
    spew.Dump(o)
}

Ausgabe:

(main.Project) {
 Id: (int64) 0,
 Title: (string) (len=5) "world",
 Name: (string) (len=5) "hello",
 Data: (string) "",
 Commits: (string) ""
}

203voto

mad.meesh Punkte 2198

Meine 2 Cent würden sein, json.MarshalIndent zu verwenden - überraschend, dass dies nicht vorgeschlagen wird, da es am einfachsten ist. Zum Beispiel:

func prettyPrint(i interface{}) string {
    s, _ := json.MarshalIndent(i, "", "\t")
    return string(s)
}

Keine externen Abhängigkeiten und führt zu schön formatierter Ausgabe.

52voto

Vivek Maru Punkte 7031

Ich denke, es wäre besser, einen benutzerdefinierten Stringer zu implementieren, wenn Sie eine Art formatierten Ausgabe eines struct möchten

zum Beispiel

package main

    import "fmt"

    type Project struct {
        Id int64 `json:"project_id"`
        Title string `json:"title"`
        Name string `json:"name"`
    }

    func (p Project) String() string {
        return fmt.Sprintf("{Id:%d, Title:%s, Name:%s}", p.Id, p.Title, p.Name)
    }

    func main() {
        o := Project{Id: 4, Name: "hello", Title: "world"}
        fmt.Printf("%+v\n", o)
    }

27voto

cokeboL Punkte 287
p = Projekt{...}
fmt.Printf("%+v", p)
fmt.Printf("%#v", p) //mit Typ

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X