因此,我找到了一些代码来帮助我开始使用Go(golang)进行反射,但是我很难获取基础值,因此我基本上可以map[string]string从结构及其字段中创建a 。
map[string]string
最终,我想将结果设为map[string]interface{},但是这个问题有点使我受阻。
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对象,但对于字符串,value上的String()方法仅输出基础String。我想获取int并将其更改为字符串,但是从相关的软件包文档中,我不会立即看到它是如何完成的。
这么…。如何从golang中的reflect.Value获取基础值?
fmt包是如何解析值的一个很好的例子。请参阅此代码。
fmt
使用上面提到的代码来匹配您的问题将如下所示:
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... }
基本上,您需要检查所有可用的种类。