vendredi 2 novembre 2018

iterate through map[string]interface{} recursively using reflect package

i just trying learn to use reflection, i wanna go througe each field in the map[string]interface{} this why i using json.Unmarshal to interface{}.

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)
}

When i run this code i get the infinite loop. Please tell me where i'm doing wrong.

Thank you.





Aucun commentaire:

Enregistrer un commentaire