传入 Reflect.New(Type) 的结果时,v.Elem() 与 Indirect(v)

2024-01-20

我的问题与这里的这个问题相关:

golang - 反射包中的 Elem 与间接 https://stackoverflow.com/questions/24318389/golang-elem-vs-indirect-in-the-reflect-package

基本上它声称下面的表达式为真,如果someX is a 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() panics.

以下行不会出现恐慌,因为如果参数不是指针类型,reflect.Indirect 将返回其参数。

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

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

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

在操场上运行它! https://play.golang.org/p/sZAa6uW4Cup

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传入 Reflect.New(Type) 的结果时,v.Elem() 与 Indirect(v) 的相关文章

  • Golang xml.Unmarshal 接口类型

    使用xml我在解组非同质类型列表时遇到问题 考虑以下 XML 文档 其嵌套元素是非同质类型的列表
  • 从私钥中提取公钥

    我尝试通过以下方式以编程方式完成步骤 2 1 openssl genrsa out signing pem 2048 2 openssl rsa in signing pem outform PEM pubout out signing p
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这
  • 接口实现中的非接口方法

    我有一个定义方法的接口 我有一个结构实施这个界面 在其中 我实现了该接口中的方法 并且还定义了其他方法 例如 package main import fmt type Animal interface MakeNoise type Dog
  • struct{} 和 struct{}{} 在 Go 中如何工作?

    我想知道 Go 中的 struct 和 struct 是什么意思 示例如下 array index struct or make map type struct struct is a keyword https golang org re
  • 为什么空切片有 24 个字节?

    我想了解创建空切片时会发生什么make int 0 我执行此代码进行测试 emptySlice make int 0 fmt Println len emptySlice fmt Println cap emptySlice fmt Pri
  • Go1编译器如何工作?

    我在一个学校项目中接触 Go 大约一个月了 我注意到 src pkg go 文件夹中的 go ast go token go parser 等包 但是 gc 编译器基于位于 src cmd gc 中的 C 文件 我的问题是关于 Go1 中用
  • 如何在Go中从interface{}解组到interface{}

    我的系统中有多个通过 RPC 进行通信的节点 我正在尝试通过 RPC 将 map string interface 发送到另一个节点 发送方使用 json Marshal 接收方使用 json Unmarshal 来获取地图 假设在发送方
  • go:找到模块但不包含包

    我正在尝试安装 go 的网络包 但收到 不包含包错误 终端截图 我咨询过 go 模块 latest 已找到但不包含包 https stackoverflow com questions 62974985 go module latest f
  • Golang 中的“相互”包导入

    是否可以在 Golang 中执行 相互 包导入之类的操作 举例来说 我有两个包 A 和 B 分别具有 AFunc 和 BFunc BFunc2 函数 package A import B func AFunc do stuff but al
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • IntelliJ 2017.1.2 GOLANG 调试不适用于包中的断点

    我的应用程序由一个 main go 文件和一些包组成 当在 main go 中命中断点时 IntelliJ 按预期工作 显示变量值等 但是 当在不同的包中设置断点时 除了被命中之外 不会显示任何变量 并且不会跳过 进入功能按预期工作 被击中
  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该
  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • golang:使用 gin 路由器服务 net.Conn

    我有一个处理传入 TCP 连接的函数 func Handle conn net Conn error 另外 我有一个初始化的 gin 路由器 带有已实现的句柄 router gin New router GET router POST Th
  • 当所有通道都关闭时中断 select 语句

    我有两个独立生成数据的 goroutine 每个将其发送到一个通道 在我的主 goroutine 中 我想在每个输出进入时使用它们 但不关心它们进入的顺序 每个通道在耗尽其输出时都会自行关闭 虽然 select 语句是像这样独立使用输入的最
  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 如何使用golang中通过引用传递的索引访问切片中的元素

    我将切片的引用传递给函数 并且我正在函数内的切片中进行更改 我还尝试使用索引访问切片中的元素 它在 golang 中抛出异常 通过引用传递的索引访问切片中的元素的最佳方法是什么 您可以在此处找到示例代码 参考 http www reddit

随机推荐

  • 如何更改 git 历史记录中的文件路径?

    这是我所拥有的 我的代码的 git 存储库 projects proj1 no git repo here yet subproj1 lt current git repo here 这就是我想要的 一个 git 存储库 它现在正在跟踪使用
  • 显示 R 中函数的源代码[重复]

    这个问题在这里已经有答案了 我可以用lm or class knn查看源代码 但我未能显示 princomp 的代码 这个函数 或其他东西 是用 R 编写的还是使用了其他字节码 我也无法使用来自的建议找到源代码如何显示包中 S4 函数的源代
  • 理解 `k : Nat ** 5 * k = n` 签名

    以下函数编译 onlyModByFive n Nat gt k Nat 5 k n gt Nat onlyModByFive n k 100 但有什么作用k以其代表Nat 5 k n syntax 另外 我该如何称呼它 这是我尝试过的 但我
  • 如何读取 web.config 文件中的 appSettings 部分?

    我的 XML 看起来像这样 文件名是web config
  • “cl”未被识别为内部或外部命令

    下面是我在 windows7 中运行 scons 编译器时的错误消息 cl is not recognized as an internal or external command operable program or batch fil
  • 使用 diff 手动合并两个文件

    我想通过执行以下操作来合并两个文件 将两个文件的差异输出到临时文件中并 手动选择我想要复制 保存的行 这里的问题是diff u只给我一个文件行的上下文 而我想以统一的格式输出整个文件 有什么办法可以做到这一点吗 一种可能适合您的选择 sdi
  • 创建反应应用程序,重新加载不起作用

    我刚刚开始使用 React 进行编码创建反应应用程序 https github com facebookincubator create react app 在文档中说 如果您进行编辑 页面将重新加载 我不知道哪个模块负责自动重新加载 we
  • Textarea charCount - 防止用户粘贴

    下面的代码工作正常 只是如果我粘贴一个超过 10 个字符的字符串 它应该只粘贴前 10 个字符 目前还没有这样做 如何防止粘贴超过 10 个字符 http jsfiddle net qfzkw 2 http jsfiddle net qfz
  • 数组大小和复制性能

    我确信这个问题之前已经得到了回答 但我找不到一个好的解释 我正在编写一个图形程序 其中管道的一部分将体素数据复制到 OpenCL 页面锁定 固定 内存 我发现这个复制过程是一个瓶颈 并对一个简单的性能进行了一些测量std copy 数据是浮
  • 在 java 7 上使用 JNI 运行 java 5/6 会出现堆栈保护警告

    使用 1 5 或启用 1 5 比较模式的 1 6 构建的 java 程序会给出以下警告 Java HotSpot TM 服务器 VM 警告 您已加载库 mynativelib so 可能禁用了堆栈保护 虚拟机现在将尝试修复堆栈防护 强烈建议
  • 如何使用 git diff 显示一些不可见的字符差异?

    当我使用git diff 我看到了如下差异 self conv 2 nn Conv2d C in C out 2 1 stride 2 padding 0 bias False self conv 2 nn Conv2d C in C ou
  • 来自多个进程的 Python 日志记录

    我有一个可能长时间运行的程序 当前有 4 个进程 但可以配置为有更多进程 我研究过从多个进程记录 http docs python org howto logging cookbook html logging to a single fi
  • 如何修复 IE 渲染 border-radius 与 box-shadow 结合的问题?

    有人知道如何 修复 IE 9 和 10 中 box shadow 和 border radius 组合的渲染吗 使用嵌入阴影时尤其明显 与 webkit gecko 相比 IE 中阴影的半径有很大不同 在此图中您可以看到问题 左边是一个带有
  • 如何使 Eclipse 输出 std:out 到标准 Windows 控制台

    正如 Eclipse 用户所知 Eclipse 默认捕获 std out 和 err 的输出 并将其转储到与 IDE 集成的控制台中 我希望 Eclipse 默认情况下仅使用标准 Windows cmd 实例来显示 std out 和 st
  • Git 的“替代机制”是什么?

    我正在学习通过man gitglossary 而这个术语一直让我困惑 因为术语表中根本没有定义它 它仅被引用两次 添加星号 alternate object database Via the alternates mechanism a r
  • 从 IP 块计算网络掩码/网关

    我们的数据中心为我们提供了所有机器的 JSON 转储 以便导入到我们自己的库存管理系统中 这提供了 IP 块 例如 192 168 1 1 26 但当我导入数百个块时 我还想计算网络掩码和网关 我查看了 PHP Doxygen 上的网络功能
  • Java VM:在 1.6.0_17 和 1.6.0_18 上均可重现 SIGSEGV,如何报告?

    EDIT 这种可重现的 SIGSEGV 发生在一台具有多个 proc 和超过 2GB 内存的 Linux 机器上 因此 Java 默认为 server 模式 有趣的是 如果我强制 client 就不会再崩溃了 我仍然不太确定如何处理我的可重
  • .net Winform 应用程序的 app.config 文件位于哪里?

    根据此链接 我们可以在 app config 文件中添加节点 http msdn microsoft com en us library ff602939 aspx http msdn microsoft com en us library
  • package.egg-info 文件夹的用途是什么?

    我正在开发一个 python 包foo 我的项目结构如下所示 foo foo bar py foo py init py README md setup py footest test py test py只有 1 行 import foo
  • 传入 Reflect.New(Type) 的结果时,v.Elem() 与 Indirect(v)

    我的问题与这里的这个问题相关 golang 反射包中的 Elem 与间接 https stackoverflow com questions 24318389 golang elem vs indirect in the reflect p