我正在尝试使用reflect来设置指向结构的指针,以便通过Go中的nil
传入interface{}
。
我有这个示例程序,但它总是打印为false,因为未设置为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()))
}
答案 0 :(得分:4)
您无法使用当前的代码。指针a
即使被包装在界面中,也会按值传递(好像),并且无法将原始副本归零。这与a
是非指针类型(例如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()))
}