如何从Golang中的reflect.Value获取基础值?

因此,我找到了一些代码来帮助我开始使用Go(golang)进行反射,但是我很难获取基础值,因此我基本上可以map[string]string从结构及其字段中创建a

最终,我想将结果设为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包是如何解析值的一个很好的例子。请参阅此代码。

使用上面提到的代码来匹配您的问题将如下所示:

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...

}

基本上,您需要检查所有可用的种类。

以上是 如何从Golang中的reflect.Value获取基础值? 的全部内容, 来源链接: utcz.com/qa/405308.html

回到顶部