отражение - получить тип элемента с одним срезом - PullRequest
1 голос
/ 29 января 2020

Я хочу рекурсивно перебрать определение структуры и для фрагментов получить тип единственного элемента. Затем создайте пустой экземпляр этого типа. Например:

type Path struct {
  Name string
  Points []Coordinate
}
type Coordinate struct {
  Latitude float64
  Longitude float64
}

Предполагая, что типы неизвестны во время выполнения, как я могу создать пустой экземпляр вложенного типа (в приведенном выше примере Coordinate). Я имею в виду:

x := Coordinate{}

Когда при вводе я получаю Path (который может быть любой другой структурой, с кусочками разных типов)?

1 Ответ

3 голосов
/ 29 января 2020

Если у вас есть дескриптор reflect.Type некоторого значения, вы можете использовать функцию reflect.New(), чтобы получить указатель на новое обнуленное значение.

Это вернет вам значение reflect.Value. Это будет указатель, чтобы получить reflect.Value указанного объекта, используйте Value.Elem(). Чтобы «развернуть» значение, содержащееся в reflect.Value(), вы можете использовать Value.Interface().

Так что если у вас есть reflect.Type дескриптор слайса, вы можете использовать Type.Elem() чтобы получить reflect.Type дескриптор типа элемента среза.

См. этот пример:

p := Path{
    Name: "foo",
    Points: []Coordinate{
        {1.1, 2.2},
        {3.3, 4.4},
    },
}

v := reflect.ValueOf(p)
f := v.FieldByName("Points")

cv := reflect.New(f.Type().Elem()).Elem()
c := cv.Interface()
fmt.Printf("%#v\n", c)

Это выводит (попробуйте его на Go Playground ):

main.Coordinate{Latitude:0, Longitude:0}
...