Отложить указатель на структуру и клонировать ее - PullRequest
0 голосов
/ 29 сентября 2018

Пожалуйста, игнорируйте, что это кажется плохой идеей, плохим стилем и т. Д.

Основная проблема здесь в том, что process() получает указатель на структуру неизвестного типа, переданную как interface{}и мне нужно клонировать базовую структуру.

Основная проблема заключается в том, что я не могу понять, как задерживать указатель, поскольку он передается как interface{}, поэтому я могу клонировать базовую структуру и вернутьит.

package main

import (
    "fmt"
    "reflect"
)

type Foo struct {
    Value string
}

func main() {
    foo1 := Foo{"bar"}
    foo2 := process(&foo1)
    result := reflect.DeepEqual(foo1, foo2)
    fmt.Println(result) // how do I make this true?
}

// objective: pointer to struct is passed it, clone of underlying struct is returned
func process(i interface{}) interface{} {
    return clone(i)
}

1 Ответ

0 голосов
/ 30 сентября 2018

Используя некоторую магию отражения, я смог заставить это работать.Спасибо, JimB , за всю вашу помощь!Код в этом вопросе явно придуман.Мне нужна эта функциональность для утилиты тестирования, которая делает «снимки» структур любого типа на разных этапах до применения различных мутаций.

...    
func process(i interface{}) (interface{}, error) {
    value := reflect.ValueOf(i)
    if value.Kind() == reflect.Ptr {
        i = value.Elem().Interface()
    }

    return copystructure.Copy(i)
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...