go - 使用Golang中的反射将通过接口{}传入的结构的指针设置为nil?
问题描述
我正在尝试使用反射来设置一个指向结构的指针,以nil
通过interface{}
in Go 传入。
我有这个示例程序,但它总是打印 false 因为 a 未设置为nil
. 我究竟做错了什么?
package main
import "reflect"
type MyStruct struct {}
func main() {
a := &MyStruct{}
wipePassed(a)
println(a == nil)
}
func wipePassed(r interface{}){
v := reflect.ValueOf(&r)
p := v.Elem()
p.Set(reflect.Zero(p.Type()))
}
解决方案
你不能用你当前的代码。a
即使指针被包装在接口中,指针也按值传递(好像),并且无法将原始副本归零。这与a
非指针类型(例如 an int
)的情况相同;没有函数f
可以改变a
代码中的值a := 42; f(a)
——你必须传递一个指针。
如果您传入指针的地址,您的代码就可以工作a
:
package main
import "reflect"
type MyStruct struct{}
func main() {
a := &MyStruct{}
wipePassed(&a)
println(a == nil)
}
func wipePassed(r interface{}) {
v := reflect.ValueOf(r)
p := v.Elem()
p.Set(reflect.Zero(p.Type()))
}
推荐阅读
- cordova - 科尔多瓦项目中的 index.js 是否必要?
- r - write_csv 科学记数法取决于尾随“000”?
- javascript - 使用 JavaScript / jQuery 设置后台链接 URL
- php - 如何回显 SQL 表中的所有内容?
- javascript - 如何阻止hammer.js与正常滚动冲突
- android - 我安装了 android studio 3.1.2。我注意到以下错误
- php - 将 acf 字段值存储在数组中
- java - 当我们在 JPanel 或 GlassPane 外部单击时退出它
- kendo-ui - 如何停止剑道颜色选择器小部件中的事件冒泡?
- bing - Azure Bing Web Search api,检索元数据