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

golang-反射包中的Elem Vs Indirect

龙弘济
2023-03-14
问题内容

来自文档

func (v Value) Elem() Value

Elem返回接口v包含的值或指针v指向的值。 如果v的种类不是Interface或Ptr,它会感到恐慌。如果v为零,它将返回零值。

func Indirect(v Value) Value

间接返回v指向的值。 如果v是nil指针,则Indirect返回零值。如果v不是指针,则Indirect返回v。

那么我可以安全地假设以下情况吗?

reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().

间接方法仅仅是上述方法的一种便捷方法吗?


问题答案:

如果a reflect.Value是指针,则v.Elem()等效于reflect.Indirect(v)。如果不是指针,则它们不是等效的:

  • 如果该值是接口,reflect.Indirect(v)则将返回相同的值,而v.Elem()将返回所包含的动态值。
  • 如果该值是其他值,则将感到v.Elem()恐慌。

reflect.Indirect助手用于需要接受特定类型或指向该类型的指针的情况。一个示例是database/sql转换例程:通过使用reflect.Indirect,它可以使用相同的代码路径来处理各种类型和指向这些类型的指针。



 类似资料:
  • 问题内容: 我试图递归地反映一个结构,打印出每个字段的类型。在字段是结构片段的情况下,我希望能够识别数组中保存的类型,然后在该类型上进行反映。 这是一些示例代码 输出看起来像这样: 当我确定字段类型是指针的一部分时,我可以通过调用subtype.Elem()来推断类型。 输出为“ main.child” 如果我然后尝试反映孩子使用 我得到以下内容: 如何使用反射API遍历子结构的字段? 问题答案:

  • 11.10.1 方法和类型的反射 在 10.4 节我们看到可以通过反射来分析一个结构体。本节我们进一步探讨强大的反射功能。反射是用程序检查其所拥有的结构,尤其是类型的一种能力;这是元编程的一种形式。反射可以在运行时检查类型和变量,例如它的大小、方法和 动态 的调用这些方法。这对于没有源代码的包尤其有用。这是一个强大的工具,除非真得有必要,否则应当避免使用或小心使用。 变量的最基本信息就是类型和值:

  • 问题内容: 我正在尝试实现一种方法,该方法更改可以具有任意结构的对象中字段的值。当我有一个指向结构的指针时,字段的遍历是没有问题的。但是,当我有一个不包装指向结构的指针但包装结构本身的接口时,简而言之,我无法更改字段: 长:http://play.golang.org/p/OsnCPvOx8F 我已阅读《反射定律》,因此我知道只有在具有指向结构的指针时,才可以修改字段。现在我的问题是: 如何获取结

  • 问题内容: 我有这个控制器: 使用此处理程序: 并以这种方式执行: 问题是编译好了。它没有显示任何错误,但是当我转到网站时,仅指向localhost,它显示: 我找不到任何错误,而且编译还可以,这很奇怪…我是Go语言的新手,所以我不知道发生了什么… 问题答案: 我通过阅读以下内容找到了答案: http://codingdict.com/questions/63176 因此,与其尝试调用该方法,不如

  • ILRuntime中的反射 用C#开发项目,很多时候会需要使用反射来实现某些功能。但是在脚本中使用反射其实是一个非常困难的事情。因为这需要把ILRuntime中的类型转换成一个真实的C#运行时类型,并把它们映射起来 默认情况下,System.Reflection命名空间中的方法,并不可能得知ILRuntime中定义的类型,因此无法通过Type.GetType等接口取得热更DLL里面的类型。而且IL

  • 问题内容: 我正在使用reflect.MakeFunc编写函数。该函数可以返回错误。成功时,我希望它为错误类型的返回值返回nil。我该如何使用反射?目前我有这个: 我懂了。我也尝试添加一个之后,但我得到了。我尝试了,但出现了细分错误。 如何获得代表nil错误的reflect.Value? 问题答案: 使用以下内容: 让我们分解一下。第一步是为: 。更简单的方法不起作用,因为参数的具体值为。没有类型