// allowSetStat 是否允许修改readonly组的值。 func (opt *Options) setValue(key string, val interface{}, allowSetReadonly bool) error { v := reflect.ValueOf(opt) v = v.Elem() t := v.Type() for i := 0; i < t.NumField(); i++ { tags := t.Field(i).Tag.Get("options") keys := strings.Split(tags, ",") if keys[1] == key { if keys[0] != "readonly" || allowSetReadonly { return conv.Value(val, v.Field(i)) } return errors.New("该值不能被修改") } } return nil }
// 将一个map数组中的数据导入到当前的options中 // {"group":"system", "key":"pageSize", "value":"5"} ==> options.PageSize=5 func (opt *Options) fromMaps(maps []map[string]string) error { v := reflect.ValueOf(opt) v = v.Elem() t := v.Type() m := make(map[string]reflect.Value, t.NumField()) for i := 0; i < t.NumField(); i++ { tags := t.Field(i).Tag.Get("options") m[tags] = v.Field(i) } for _, item := range maps { obj, found := m[item["group"]+","+item["key"]] if !found { continue } if err := conv.Value(item["value"], obj); err != nil { return err } } return nil }