如何修改golang中的嵌入结构?

问题描述 投票:0回答:1

我想在 golang 中设置嵌入结构的字段, 我怎样才能做到这一点。 尝试使用反射但对我不起作用。

type ProductTypeDbModel struct {
    Entity.BaseEntity
    Id            int64  `json:"id" db:"id"`
    Name          string `json:"name" db:"name"`
    DisplayName   string `json:"display_name" db:"display_name"`
    ShortCode     string `json:"short_code" db:"short_code"`
    Version       int64  `json:"version" db:"version"`
    IsDeleted     int64  `json:"is_deleted" db:"is_deleted"`
    NamespaceCode string `json:"namespace_code" db:"namespace_code"`
}

type BaseEntity struct {
    Id        int64     `db:"id"`
    CreatedBy int64     `db:"created_by"`
    UpdatedBy int64     `db:"updated_by"`
    CreatedAt time.Time `db:"created_at"`
    UpdatedAt time.Time `db:"updated_at"`
    Version   int64     `db:"version"`
}

我的 ProductTypeDb 模型是 struct 实现 BaseRepository。

现在我有 ProductTypeDbModel 类型的 Base Repo 对象,我想在其中修改/设置更新的值。

尝试了以下代码。

func SetUpdatedByToBaseRepository(model BaseRepository, updatedByValue int64) (BaseRepository, error) {
    val := reflect.ValueOf(model)

    for i := 0; i < val.NumField(); i++ {
        field := val.Type().Field(i)
        fieldName := field.Name

        if field.Anonymous {
            // Get the value of the embedded struct field
            embeddedField := val.Field(i)

            // Check if the embedded field is valid and addressable
            if embeddedField.Kind() == reflect.Struct && embeddedField.CanSet() {
                // Set the value of the UpdatedBy field in the embedded struct
                if fieldName == "BaseEntity" {
                    // Get the field value of UpdatedBy within BaseEntity
                    updatedByField := embeddedField.FieldByName("UpdatedBy")
                    if updatedByField.IsValid() && updatedByField.CanSet() {
                        updatedByField.SetInt(updatedByValue)
                    }
                }
            }
        }
    }
    return model, nil
}

但是embeddedField.CanSet()返回false,我怎样才能做到这一点。

go pointers struct reflection interface
1个回答
0
投票
func SetUpdatedByToBaseRepository(model interface{}, updatedByValue int64) error {
val := reflect.ValueOf(model)
if val.Kind() != reflect.Ptr || val.Elem().Kind() != reflect.Struct {
    return errors.New("model must be a pointer to a struct")
}
val = val.Elem() 

baseEntityField := val.FieldByName("BaseEntity")
if baseEntityField.IsValid() {
    updatedByField := baseEntityField.FieldByName("UpdatedBy")
    if updatedByField.IsValid() && updatedByField.CanSet() {
        updatedByField.SetInt(updatedByValue)
        return nil
    }
}
return errors.New("unable to set UpdatedBy")

}

© www.soinside.com 2019 - 2024. All rights reserved.