Golang: print struct as it would appear in source code
Asked Answered
T

1

10

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?

Thoughtful answered 5/12, 2016 at 17:25 Comment(0)
J
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

Jessjessa answered 5/12, 2016 at 17:34 Comment(8)
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?Thoughtful
@jmite: what is the type of field in the struct?Jessjessa
It's type FooThoughtful
@jmite: then the type conversion is superfluous, since the string literal can be assigned to the Foo type.Jessjessa
@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.Jessjessa
Looks like the solution is to implement the GoString() method, described in the fmt library, thanks!Thoughtful
Ugh...Correction, this is working for map as well, my IDE terminal is stupid and did not print it as a string. ThanksPectize
Is it possible to avoid printing the package name? (in this example print only &T{A:"hello", B:[]uint8{0x77, 0x6f, 0x72, 0x6c, 0x64}}Windy

© 2022 - 2024 — McMap. All rights reserved.