итерация по интерфейсу map [string] {} рекурсивно с использованием пакетаlect - PullRequest
0 голосов
/ 02 ноября 2018

Я просто пытаюсь научиться использовать отражение, я хочу пройти через каждое поле в интерфейсе карты [string] {}, поэтому я использую json.Unmarshal для интерфейса {}.

func i2s(data interface{}, out interface{}) error {
    fmt.Println(reflect.TypeOf(data).Kind())
    switch reflect.TypeOf(data).Kind() {
    case reflect.Map, reflect.Array, reflect.Ptr, reflect.Slice:
        i2s(reflect.TypeOf(data).Elem(), out)

    case reflect.Struct:
        for i := 0; i < reflect.ValueOf(data).NumField(); i++ {
            f := reflect.TypeOf(data).Field(i)
            fmt.Println(f.Name, f.Type.Name())

            if f.Tag != "" {
                fmt.Println(f.Tag)
            }
        }
    }
    return nil
}

type Simple struct {
    ID       int
    Username string
    Active   bool
}

func main() {
    test := &Simple{
        ID:       42,
        Username: "dcandu",
        Active:   true,
    }

    jsonRaw, _ := json.Marshal(test)

    var tmpData interface{}
    json.Unmarshal(jsonRaw, &tmpData)

    result := new(Simple)
    i2s(tmpData, result)
}

Когда я запускаю этот код, я получаю бесконечный цикл. Пожалуйста, скажите мне, где я делаю неправильно.

Спасибо.

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