使用反射包递归遍历map [string] interface {}

时间:2018-11-02 17:39:16

标签: go reflection

我只是尝试学习使用反射,我想通过map [string] interface {}中的每个字段,这就是为什么我使用 json。解组接口{}。

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

运行此代码时,出现无限循环。 请告诉我我在哪里做错了。

谢谢。

0 个答案:

没有答案