How To Print Struct Variables In Golang
Alex Garella
27 April 2022
You might sometimes wonder how to print struct variables in Go in order to inspect the value for debugging purposes. Here it comes a simple example where we have a struct with a string and a pointer to another struct. Which consenquently has two string values.
package main
import (
"fmt"
)
type ServicePortName struct {
Name string
Port string
}
type ServiceEndpoint struct {
Endpoint string
ServicePortName *ServicePortName
}
func main() {
svc := &ServiceEndpoint{"/api/users", &ServicePortName{"app.user", "9000"}}
fmt.Printf("%+v", svc)
}
Indeed is quite easy to use the most common known package in the Go standard library: fmt
. Which offers the following formatting option %+v
. https://golang.org/pkg/fmt/#hdr-Printing.
%v the value in a default format
when printing structs, the plus flag (%+v) adds field names
This is the expected output from the above code snippet
{Endpoint:/api/users ServicePortName: 0x40a0f0}
At this point we also want to be able to inspect the struct value referenced by the struct pointer *ServicePortName
An easy way to recursively printing all the values from a given variable we can use an handy method https://golang.org/pkg/encoding/json/#MarshalIndent in the encoding/json
package which always come with the standard library
package main
import (
"fmt"
"encoding/json"
)
type ServicePortName struct {
Name string
Port string
}
type ServiceEndpoint struct {
Endpoint string
ServicePortName *ServicePortName
}
func main() {
svc := &ServiceEndpoint{"/api/users", &ServicePortName{"app.user", "9000"}}
s, _ := json.MarshalIndent(svc, "", "\t")
fmt.Println(string(s))
}
The expected output at this point is the following
{
"Endpoint": "/api/users",
"ServicePortName": {
"Name": "app.user",
"Port": "9000"
}
}