使用Golang中的reflect设置指向通过接口{}传入的struct到nil的指针?

时间:2018-05-24 08:51:36

标签: go

我正在尝试使用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()))
}

1 个答案:

答案 0 :(得分:4)

您无法使用当前的代码。指针a即使被包装在界面中,也会按值传递(好像),并且无法将原始副本归零。这与a是非指针类型(例如int)时的情况相同;没有功能f可以更改代码aa := 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()))
}