我想在 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,我怎样才能做到这一点。
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")
}