¿Cómo imprimir variables de estructura en la consola?

Resuelto fnr asked hace 10 años • 17 respuestas

¿Cómo puedo imprimir (en la consola) Id, Title, Name, etc. de esta estructura en Golang?

type Project struct {
    Id      int64   `json:"project_id"`
    Title   string  `json:"title"`
    Name    string  `json:"name"`
    Data    Data    `json:"data"`
    Commits Commits `json:"commits"`
}
fnr avatar Jul 01 '14 20:07 fnr
Aceptado

Para imprimir el nombre de los campos en una estructura:

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

Del fmtpaquete :

al imprimir estructuras, la bandera más ( %+v) agrega nombres de campos

Eso supone que tienes una instancia de Proyecto (en ' yourProject')

El artículo JSON and Go brindará más detalles sobre cómo recuperar los valores de una estructura JSON.


Esta página de ejemplo proporciona otra técnica:

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))

Eso imprimiría:

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

Si no tiene ninguna instancia, debe usar la reflexión para mostrar el nombre del campo de una estructura determinada, como en este ejemplo .

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())
}
VonC avatar Jul 01 '2014 14:07 VonC

Quiero recomendar go-spew , que según su github "implementa una impresora bonita y profunda para estructuras de datos Go para ayudar en la depuración".

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

ejemplo de uso:

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)
}

producción:

(main.Project) {
 Id: (int64) 0,
 Title: (string) (len=5) "world",
 Name: (string) (len=5) "hello",
 Data: (string) "",
 Commits: (string) ""
}
Martin Olika avatar Dec 27 '2015 11:12 Martin Olika

Mis 2 centavos serían para usar json.MarshalIndent; me sorprende que no se sugiera esto, ya que es el más sencillo. Por ejemplo:

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

sin departamentos externos y da como resultado una salida bien formateada.

mad.meesh avatar Jul 10 '2018 16:07 mad.meesh

Creo que sería mejor implementar un stringer personalizado si desea algún tipo de salida formateada de unstruct

Por ejemplo

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)
    }
Vivek Maru avatar Mar 29 '2017 08:03 Vivek Maru