【发布时间】:2013-08-08 03:09:34
【问题描述】:
所以我找到了一些代码来帮助我开始在 Go (golang) 中进行反射,但我无法获取底层值,因此我基本上可以从结构和它的字段创建一个 map[string]string。
最后,我想把结果变成map[string]interface{},但是这个问题有点阻碍我。
我现在的代码:
package main
import (
"fmt"
"reflect"
)
type Foo struct {
FirstName string `tag_name:"tag 1"`
LastName string `tag_name:"tag 2"`
Age int `tag_name:"tag 3"`
}
func inspect(f interface{}) map[string]string {
m := make(map[string]string)
val := reflect.ValueOf(f).Elem()
for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
typeField := val.Type().Field(i)
f := valueField.Interface()
val := reflect.ValueOf(f)
m[typeField.Name] = val.String()
}
return m
}
func dump(m map[string]string) {
for k, v := range m {
fmt.Printf("%s : %s\n", k, v)
}
}
func main() {
f := &Foo{
FirstName: "Drew",
LastName: "Olson",
Age: 30,
}
a := inspect(f)
dump(a)
}
运行代码的输出:
FirstName : Drew
LastName : Olson
Age : <int Value>
据我了解,FirstName 和 LastName 的输出是实际的 reflect.Value 对象,但对于字符串,值上的 String() 方法只输出底层字符串。我想获取 int 并将其更改为字符串,但从 relfect 包文档中我没有立即看到它是如何完成的。
Soo....如何从 golang 中的 reflect.Value 中获取基础值?
【问题讨论】:
-
reflect.Value的 printf 将 (Go 1.5) 打印其实际值。见my answer below -
@VonC 酷,感谢您的帮助,终于按照您的建议在 fmt 的帮助下获得了价值:goplay.space/#w98PfGoZHl8
-
使用字段名称、类型、值和标签运行解决方案:goplay.space/#15XAsJBH5Sb
-
@Macilias 干得好。 (顺便说一句,我不知道 goplay.space:它看起来很方便)
标签: reflection go