当前位置: 首页 > 面试题库 >

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

养枫涟
2023-03-14
问题内容

因此,我找到了一些代码来帮助我开始使用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...
}

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



 类似资料:
  • 问题内容: 假设我有以下长度为3的整数数组: 然后我只抓了前两个项目 在这两种情况下,调用numSlice和nums都会产生3,分别产生2和3。 如果我随后附加到该slice(),则基础数组()现在为。两者的值均保持为3,因为切片的基础数组相同,并且切片的len现在为3。 但是,如果我再次追加到该片(),则该片的基础数组必须更改- 我们看到的情况是,现在numSlice增加了一倍,而len现在是4

  • 问题内容: 我正在寻找如何使用golang从Kubernetes集群中的Pod获取日志的解决方案。我看过“ https://github.com/kubernetes/client- go ”和“ https://godoc.org/sigs.k8s.io/controller- runtime/pkg/client ”,但听不懂如何将它们用于此目的。除了日志外,我在获取K8S中的Pod或任何其他

  • 问题内容: 我想访问作为的实例的基础类的类名。 这可能吗? 问题答案: 您可以通过调用获取创建代理的对象 注意,在没有 基础类 的情况下。代理定义为: 接口 调用处理程序 通常将包装好的类传递给具体的调用处理程序。

  • 问题内容: com / jinzhu / gorm”和“ github.com/go-sql- driver/mysql”包与我的数据库进行交互,并尝试获取表的描述,但未找到该功能。请帮助 问题答案: 使用 gorm, 您可以执行自定义查询并以 struct形式 返回她,以下是如何显示表说明的示例: 通过gorm查看更多信息:http ://jinzhu.me/gorm/advanced.html

  • 本文向大家介绍golang中struct和interface的基础使用教程,包括了golang中struct和interface的基础使用教程的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于golang中struct和interface的相关内容,是属于golang的基本知识,下面话不多说了,来一起看看详细的介绍吧。 struct struct 用来自定义复杂数据结构,可以

  • 问题内容: 状态 在Linux上,从哪里获得“主机的根CA集”? 我需要知道这一点,以便能够全局添加另一个要信任的根CA。 问题答案: 它在以下位置搜索:https : //golang.org/src/crypto/x509/root_linux.go 摘抄