Go 中的反射类型和值

标签 reflection go

我不是很清楚这个代码片段的行为。

func show(i interface{}) {
    switch t := i.(type) {
    case *Person:
      t := reflect.TypeOf(i)  //what t contains?   
      v := reflect.ValueOf(i)  //what v contains?
      tag := t.Elem().Field(0).Tag
      name := v.Elem().Field(0).String() 
    }
}

反射中的类型和值有什么区别?

最佳答案

reflect.TypeOf() 返回 reflect.Type reflect.ValueOf() 返回 reflect.Value . reflect.Type 允许您查询绑定(bind)到具有相同类型的所有变量的信息,而 reflect.Value 允许您查询信息并对任意数据执行操作类型。

此外,reflect.ValueOf(i).Type() 等同于 reflect.TypeOf(i)

在上面的示例中,您使用 reflect.Type 获取 Person 结构中第一个字段的“标签”。您从 *Person 的类型开始。要获取 Person 的类型信息,您使用了 t.Elem()。然后,您使用 .Field(0).Tag 提取了第一个字段的标签信息。您传递的实际值 i 并不重要,因为第一个字段的 Tag 是类型的一部分。

您使用 reflect.Value 获取值 i 的第一个字段的字符串表示形式。首先,您使用 v.Elem()i 指向的结构获取一个值,然后访问第一个 Field 的数据 (.Field(0)),最后将该数据转换为字符串 (.String())。

关于Go 中的反射类型和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115677/

相关文章:

go - 计算预定义数字类型之外的大数

c# - 如何编写一个接受数据行并填充对象属性的通用函数?

php - 在 PHP 中获取模型属性

python - 解析 docopt 参数类型(任何语言)

performance - 当函数参数是接口(interface)时复制什么

git - go build 不起作用,因为 git 在 Linux 上被对等方重置了致命的读取错误连接

string - 读取一个文本文件,替换其中的单词,输出到另一个文本文件

json - 从 Dart 中没有类的字符串/符号创建对象的实例?

c# - 如何在运行时在 IEnumerable<T> 上创建动态 Select?

scala - 在运行时访问函数源代码的宏