How To Print Struct Variables In Golang

Alex Garella image

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