使用反射获取指向值的指针
检查接口的字段需要在 Go 中使用反射。然而,当尝试检索非指针字段的地址时,就会出现挑战。本文解决了这些挑战并提供了解决方案。
在提供的代码示例中,名为 InspectStruct 的函数遍历给定的结构并输出有关每个字段的详细信息。虽然大多数字段都被考虑在内,但嵌入在结构中更高级别的非指针字段会产生“不可寻址”的结果。
解决方案
问题在于Reflect.Value.Interface() 方法的用法。要获取非指针字段的地址,建议将reflect.Value而不是interface{}传递给InspectStruct函数。下面更正后的代码包含了此更改:
<code class="go">func InspectStructV(val reflect.Value) { // ... (remaining code is identical) } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
通过此修改,InspectStruct 函数将按预期运行,生成结构内所有字段的地址,无论其深度或指针状态如何。这可以在更新的测试结果中看到:
Field Name: Id, Field Value: 1, Address: 0x408125440 , Field type: int , Field kind: int Field Name: F, Field Value: {2 {3}}, Address: 0x408125444 , Field type: main.V , Field kind: struct Field Name: Id, Field Value: 2, Address: 0x408125450 , Field type: int , Field kind: int Field Name: F, Field Value: {3}, Address: 0x408125458 , Field type: main.Z , Field kind: struct Field Name: Id, Field Value: 3, Address: 0x408125460 , Field type: int , Field kind: int
以上是如何在 Go 中使用反射获取指向值的指针?的详细内容。更多信息请关注PHP中文网其他相关文章!