首页 > 解决方案 > 使用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()))
}

标签: go

解决方案


你不能用你当前的代码。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()))
}

推荐阅读