9

Similar to this question but not quite identical.

I'm doing some code-generation, making .go files from within Go. I've got a struct, and I want to generate the text representation of it so that I can insert it as a literal into the generated code.

So, if I had myVal := SomeStruct{foo : 1, bar : 2}, I want to get the string "SomeStruct{foo : 1, bar : 2}".

Is this possible in Go?

Community
  • 1
  • 1
jmite
  • 8,171
  • 6
  • 40
  • 81

1 Answers1

18

From the fmt package:

%#v   a Go-syntax representation of the value

This is as close as you can come with built-in formatting, after removing the package identifier (main. in this example) from the output.

type T struct {
    A string
    B []byte
}

fmt.Printf("%#v\n", &T{A: "hello", B: []byte("world")})

// out
// &main.T{A:"hello", B:[]uint8{0x77, 0x6f, 0x72, 0x6c, 0x64}}

Run

Sam Whited
  • 6,880
  • 2
  • 31
  • 37
JimB
  • 104,193
  • 13
  • 262
  • 255
  • I tried this, but when I've got `type Foo string` and `{field : Foo("Bar")}`, it just prints this to `{field : "Bar"}`. Any workarounds for this? – jmite Dec 05 '16 at 20:45
  • @jmite: what is the type of `field` in the struct? – JimB Dec 05 '16 at 20:53
  • It's type `Foo` – jmite Dec 05 '16 at 20:57
  • @jmite: then the type conversion is superfluous, since the string literal can be assigned to the `Foo` type. – JimB Dec 05 '16 at 20:59
  • 1
    @jmite: this still can't do everything, nested pointers are only going to be printed as `%p` with a type, and values assigned to an interface will only show the underlying type. If you want more detailed output, you need to format it manually. – JimB Dec 05 '16 at 21:03
  • Looks like the solution is to implement the `GoString()` method, described in the `fmt` library, thanks! – jmite Dec 05 '16 at 21:50
  • Ugh...Correction, this is working for `map` as well, my IDE terminal is stupid and did not print it as a string. Thanks – Matteo Aug 01 '20 at 03:46
  • Is it possible to avoid printing the package name? (in this example print only `&T{A:"hello", B:[]uint8{0x77, 0x6f, 0x72, 0x6c, 0x64}}` – Pioz Sep 02 '22 at 11:28