繁体   English   中英

如何使用反射将嵌套结构的修改值分配给结构

[英]How to assign modified value of nested struct using reflection to struct

我有这个结构

type Library struct {
    Book            Book           
    Owner           Owner           
    Editorial       Editorial
}

我不得不将自动生成的Book结构的标签之一从category修改为categoryID

type Book struct {
    ID             string           `json:"id"`
    Title          string           `json:"title"`
    Description    string           `json:"description"`
    Category       string           `json:"category"`
} 

我的问题是,在修改这些字段并获得 Book 的正确结构后,如何将其设置为Library.Book中的新结构?

我的代码:

func renameTags(p any, m map[string]string) any {

    rv := reflect.ValueOf(p)
    re := rv.Elem()
    rt := rv.Elem().Type()

    fields := make([]reflect.StructField, rt.NumField())
    for i := range fields {
        f := rt.Field(i) // Book i == 0

        if f.Type.Kind() == reflect.Struct && f.Type.Name() == "Book" {
            fields2 := make([]reflect.StructField, f.Type.NumField()) // f == Book
            for j := 0; j < f.Type.NumField(); j++ {
                subField := f.Type.Field(j)
                tag := subField.Tag.Get("json")
                if v, ok := m[tag]; ok {
                    subField.Tag = reflect.StructTag(`json:"` + v + `"`)
                }
                fields2[j] = subField // change structure of Book
            }

            // here how to append new structure to f ?

            //kk := reflect.StructOf(fields2).Elem()

        }

        fields[i] = f
    }

    st := reflect.StructOf(fields)
    return rv.Convert(reflect.PtrTo(st)).Interface()
}

任何建议将不胜感激,谢谢!

您可以使用 reflect.New 创建修改后结构的新实例,然后将值分配给原始结构中的适当字段。 这是更新的代码:

func renameTags(p any, m map[string]string) any {

    rv := reflect.ValueOf(p)
    re := rv.Elem()
    rt := rv.Elem().Type()

    fields := make([]reflect.StructField, rt.NumField())
    for i := range fields {
        f := rt.Field(i) // Book i == 0

        if f.Type.Kind() == reflect.Struct && f.Type.Name() == "Book" {
            fields2 := make([]reflect.StructField, f.Type.NumField()) // f == Book
            for j := 0; j < f.Type.NumField(); j++ {
                subField := f.Type.Field(j)
                tag := subField.Tag.Get("json")
                if v, ok := m[tag]; ok {
                    subField.Tag = reflect.StructTag(`json:"` + v + `"`)
                }
                fields2[j] = subField // change structure of Book
            }

            newStruct := reflect.New(reflect.StructOf(fields2))
            re.Field(i).Set(newStruct)
        }

        fields[i] = f
    }

    st := reflect.StructOf(fields)
    return rv.Convert(reflect.PtrTo(st)).Interface()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM