代码之家  ›  专栏  ›  技术社区  ›  Kevin Holditch

在golang中使用reflect将指向通过接口传入的结构的指针设置为nil?

go
  •  2
  • Kevin Holditch  · 技术社区  · 8 年前

    我正试图使用reflect将指向结构的指针设置为 nil 通过 interface{} 进去。

    我有这个示例程序,但它总是打印错误,因为 . 我做错什么了?

    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 回复  |  直到 8 年前
        1
  •  6
  •   Paul Hankin    8 年前

    您不能使用当前代码。指针 a 按值传递,即使它被包装在一个接口中,也无法将原始副本归零。这和当时的情况一样 是非指针类型(例如 int );没有功能 f 它可以改变 在法典中 a := 42; f(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()))
    }