¿Cómo imprimir variables de estructura en la consola?
¿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"`
}
Para imprimir el nombre de los campos en una estructura:
fmt.Printf("%+v\n", yourProject)
Del fmt
paquete :
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())
}
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) ""
}
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.
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)
}