Хотелось бы что-нибудь подобное? Может потребоваться некоторая корректировка в зависимости от вашей конкретной структуры и варианта использования (хотите ли вы печатать интерфейсы {}, где значение на самом деле является структурой и т. Д.)
package main
import (
"fmt"
"reflect"
)
func printStruct(t interface{}, prefix string) {
s := reflect.Indirect(reflect.ValueOf(t))
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%s%s %s\n", prefix, typeOfT.Field(i).Name, typeOfT.Field(i).Type)
switch f.Type().Kind() {
case reflect.Struct, reflect.Ptr:
fmt.Printf("%s{\n", prefix)
printStruct(f.Interface(), prefix+"\t")
fmt.Printf("%s}\n", prefix)
}
}
}
Тогда для этой структуры:
type C struct {
D string
}
type T struct {
A int
B string
C *C
E interface{}
F map[string]int
}
t := T{
A: 23,
B: "hello_world",
C: &C{
D: "pointer",
},
E: &C{
D: "interface",
},
}
Вы получаете:
A int
B string
C *main.C
{
D string
}
E interface {}
F map[string]int
Go Playground Link: https://play.golang.org/p/IN8-fCOe0OS