How to get underlying value from a reflect.Value in golang?
It looks like you're on the right track. The problem I see with your code is it makes assumptions about the values, meaning when do you call Elem()
and how many times (to resolve pointers). In order to know this you need to look at the reflect.Kind
. Is the value a reflect.Ptr
? Then use Elem()
.
Once you have the value from val.Interface()
/ val.String()
/ val.Int()
you can convert your values as needed. What you use is going to depend on reflect.Kind
. To convert an int
to/from string
you need to use the strconv
package.
The encoding/json
and encoding/xml
packages do this kind of work already. The source code provides some great examples. For example, take a look at copyValue
in encoding/xml/read.go and marshalSimple
in encoding/xml/marshal.go.
A good example of how to parse values is the fmt
package. See this code.
Using the mentioned code to match your problem would look like this:
switch val.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
m[typeField.Name] = strconv.FormatInt(val.Int(), 10)
case reflect.String:
m[typeField.Name] = val.String()
// etc...
}
Basically you need to check for all available Kinds.
This should be easier to do with Go 1.5 (August 2015)
See review 8731 and commit 049b89d by Rob Pike (robpike
):
fmt
: treatreflect.Value
specially - as the value it holds
This would allow you to print the actual value of a Reflect.Value()
argument:
When a
reflect.Value
is passed toPrintf
(etc.),fmt
called theString
method, which does not disclose its contents.
To get the contents, one could callValue.Interface()
, but that is illegal if theValue
is not exported or otherwise forbidden.This CL improves the situation with a trivial change to the
fmt
package: when we see areflect.Value
as an argument, we treat it exactly as we treat areflect.Value
we make inside the package.
This means that we always print the contents of theValue
as if that was the argument toPrintf
.This is arguably a breaking change but I think it is a genuine improvement and no greater a break than many other tweaks we have made to formatted output from this package.