-
-
Save justincase/5469009 to your computer and use it in GitHub Desktop.
type T struct { | |
A int | |
B string | |
} | |
t := T{23, "skidoo"} | |
s := reflect.ValueOf(&t).Elem() | |
typeOfT := s.Type() | |
for i := 0; i < s.NumField(); i++ { | |
f := s.Field(i) | |
fmt.Printf("%d: %s %s = %v\n", i, | |
typeOfT.Field(i).Name, f.Type(), f.Interface()) | |
} | |
// The output of this program is | |
// | |
// 0: A int = 23 | |
// 1: B string = skidoo |
thank you :)
panic: reflect: call of reflect.Value.NumField on interface Value
It gives me this error.
My struct is defined as :
type bundle struct {
valnode *Node
tree *tree
}
awesome guy!
Excellent - Clean, succinct
Spent several hours before finding this Thanks
f.Interface undefined..
@xgz123 you're probably calling reflect.TypeOf(struct)
rather than reflect.ValueOf(struct)
. Calling Field(i)
on a Type
returns a StructField
which doesn't have the Interface
method. Calling reflect.ValueOf(struct).Field(i)
returns a Value
which does have the Interface
method.
f.Interface()
only works for the struct
type which has public fields.
This code worked.
v := reflect.ValueOf(structValue)
t := v.Type()
for i := 0; i < t.NumField(); i++ {
name := t.Field(i).Name
value := v.FieldByName(name).Interface()
}
@mrdulin just put in a guard to check f.PkgPath, since it's only populated for unexported fields, f.PkgPath == ""
will only be true for exported fields, so you can avoid panics when trying to process unexported fields.
well played, thank you :)