Установить указатель на структуру, передаваемую через интерфейс {} на ноль, используя отражение в Golang? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать отражение, чтобы установить для указателя на структуру значение nil, переданное через interface{} в Go.

У меня есть этот пример программы, но он всегда печатает 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 голосов
/ 24 мая 2018

Вы не можете с вашим текущим кодом.Указатель 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()))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...