1

How can I pretty print the object below?

package main

// OBJECT: {
//   TABLE: {
//     files: [],
//     data: {
//        CODE: {
//          name: "NAME",
//          count: 123,
//       }
//     }
//
// }

import (
    "encoding/json"
    "fmt"
    "log"
)

type Container map[string]*Table

type Table struct {
    files []string
    data  map[string]*Data
}

type Data struct {
    name  string
    count int
}

func main() {

    object := Container{
        "table1": {
            files: []string{"file-1.1"},
            data: map[string]*Data{
                "XYZ": {
                    name:  "foo",
                    count: 123,
                },
            },
        },
        "table2": {
            files: []string{
                "file-2.1",
                "file-2.2",
                "file-2.3",
            },
        },
        "table3": {files: []string{"file-3.1"}},
    }

    fmt.Printf("%#v\n", &object)
    objectJSON, err := json.MarshalIndent(object, "", "  ")
    if err != nil {
        log.Fatalf(err.Error())
    }
    fmt.Printf("%s\n", objectJSON)

}

https://go.dev/play/p/FRWZsfwgyNU

With this code, I'm only getting the first depth of my object:

&main.Container{"table1":(*main.Table)(0xc00005c020), "table2":(*main.Table)(0xc00005c040), "table3":(*main.Table)(0xc00005c060)}
{
  "table1": {},
  "table2": {},
  "table3": {}
}

Program exited.
1
  • 2
    You can have those pointer types implement the Stringer interface. Commented May 19, 2022 at 16:39

1 Answer 1

2

This isn't about "depth". You can't generically pretty-print private, un-exported fields using fmt.Printf or json.Marshal. If you want the variable to appear when marshling, export them (ie, change Table.files to Table.Files. Go will marshal exported fields to arbitrary depth:

{
  "foo1": {
    "Files": [
      "file-1.1"
    ],
    "Data": {
      "XYZ": {
        "Name": "foo",
        "Count": 123
      }
    }
  },
  "foo2": {
    "Files": [
      "file-2.1",
      "file-2.2",
      "file-2.3"
    ],
    "Data": null
  },
  "foo3": {
    "Files": [
      "file-3.1"
    ],
    "Data": null
  }
}

If you want to pretty print the object using fmt.Printf("%v", ...) then you need to implement the Stringer interface on each of your class. At that point, the decision about how to print the object is entirely up to you and you can include public or private members in whatever format you'd like.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks a lot. How come that converting to capital the first letter has so much impact ?
Capitalization is visibility.Foo is public. foo is private.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.