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

Я пытаюсь отразить часть указателей на структуре, хранящейся в интерфейсе {}

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

package main

import (
    "fmt"
    "reflect"
)

type teststruct struct {
    prop1 string
    prop2 string
}

func main() {   
    test := teststruct{"test", "12"}

    var container interface{}

    var testcontainer []*teststruct

    testcontainer = append(testcontainer, &test)

    container = testcontainer   

    rcontainer := reflect.ValueOf(container)
    fmt.Println(rcontainer.Kind())

    rtest := rcontainer.Index(0).Elem()
    fmt.Println(rtest)

    rteststruct := reflect.ValueOf(rtest)
    fmt.Println(rteststruct.Kind())

    typeOfT := rteststruct.Type()

    for i := 0; i < rteststruct.NumField(); i++ {
        f := rteststruct.Field(i)
        fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.String())
    } 
}

Какие результаты

slice
{test 12}
struct
0: typ *reflect.rtype = <*reflect.rtype Value>
1: ptr unsafe.Pointer = <unsafe.Pointer Value>
2: flag reflect.flag = <reflect.flag Value>

Я определенно что-то здесь упускаю, кто-то сможет мне объяснить, что?

1 Ответ

0 голосов
/ 23 ноября 2018

rtest := rcontainer.Index(0).Elem() уже является значением, поэтому, когда вы делаете это: rteststruct := reflect.ValueOf(rtest), вы фактически получаете reflect.Value, что, конечно, struct.

Замените конец вашего кодас этим:

typeOfT := rtest.Type()

for i := 0; i < rtest.NumField(); i++ {
    f := rtest.Field(i)
    fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.String())
}

Детская площадка

...