如何使用反射在Golang中将通过interface{}传递的结构体指针设置为nil?

5

我正在尝试使用反射在Go语言中将指向结构体的指针设置为通过interface{}传入的nil

我有这个示例程序,但它总是打印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()))
}
1个回答

12
无法使用您当前的代码。指针a被传递(仿佛)按值传递,即使它被包装在接口中,也没有办法将原始副本清零。这与a是非指针类型(例如int)的情况相同;在代码a := 42; f(a)中没有函数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()))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接