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

v.Elem()与Inref(v)传递reflect.New(Type)的结果时

康文昌
2023-03-14
问题内容

基本上,它声称以下表达式为真,如果someX是一个reflect.Value包含一个指针

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

如果是这样,那么为什么我下面的代码在最后一行崩溃?

package main

import (
  "reflect"
  "log"
)

type Person struct {
  Name string

}

func main() {


newitem := reflect.New(reflect.ValueOf(Person{}).Type())

log.Println(reflect.TypeOf(newitem)) // shows reflect.Value
log.Println(newitem.Type().Kind()) // shows it is a ptr

log.Println(reflect.Indirect(reflect.ValueOf(newitem))) // this line does not cause panic
log.Println(reflect.ValueOf(newitem).Elem()) // this line causes panic

}

我一直很难理解Go中的reflect包,并且可能我误解了Go语言的一些基本方面,如我在上周一直在问的堆栈溢出问题中所述。


问题答案:

让我们分解以下几行:

log.Println(reflect.ValueOf(newitem).Elem())

该值newItem是一个reflect.Value。表达式reflect.ValueOf(newItem)返回reflect.Value包含的reflect.Value。因为所包含的值不是指针或接口,所以调用了Elem()紧急情况。

由于参数不是指针类型,因此以下行不会引起恐慌,因为reflect.Indirect返回其参数。

 log.Println(reflect.Indirect(reflect.ValueOf(newitem)))

问题在于应用程序将reflect.Values与reflect.Values包装在一起。如以下代码所示,直接使用reflect.Value:

log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())

在操场上运行它!



 类似资料:
  • vue中通过v-bind也可以传递函数,但是我看大部分使用都是v-on去传递事件,然后子组件通过emit触发父组件的函数。 为什么v-bind传递函数这么少见呢?v-bind传递函数都能被v-on + emit 替代吗?或者它们有什么优劣势?

  • 我正在研究一个合并排序,它对int[]进行排序。我的mergeSort方法接受数组、startindex和EndIndex。我还输出了main方法中的before和after。after数组的结果与before相同。我看不出我的ALG做错了什么。我一直在查阅其他人对合并的看法,看起来我做得很对。显然不是,因为列表没有排序…我的合并排序算法做错了什么? 更新:所以我对我的代码做了一些修改,看起来分割

  • 我试着让我的相机为我的android应用程序工作,但我一直得到以下错误 02-07 22:30:48.217 131 97-13197/com.example.romsm.lap E/AndroidRuntime:致命异常:main java.lang.RuntimeException:将结果ResultInfo{who=null,request=1,result=-1,data=intent{a

  • 本文向大家介绍Fragment跳转时传递参数及结果回传的方法(推荐),包括了Fragment跳转时传递参数及结果回传的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 今天总结一下Fragment间的参数传递及结果返回的方法。 效果图: 1、点击“加载第二个Fragment按钮”,加载出第二个Fragment,同时传递过去参数:“从Fragment1传来的参数”这几个String; 2、当用户

  • 就前面所讲,函数的基本内容已经完毕。但是,函数还有很多值得不断玩味的细节。这里进行阐述。 参数的传递 python中函数的参数通过赋值的方式来传递引用对象。下面总结通过总结常见的函数参数定义方式,来理解参数传递的流程。 def foo(p1,p2,p3,...) 这种方式最常见了,列出有限个数的参数,并且彼此之间用逗号隔开。在调用函数的时候,按照顺序以此对参数进行赋值,特备注意的是,参数的名字不重