diff --git a/map.go b/map.go index 9a16202..ab8912c 100644 --- a/map.go +++ b/map.go @@ -7,7 +7,10 @@ // Date : 2024-11-06 18:27 package wrapper -import "sync" +import ( + "errors" + "sync" +) var mapLock = &sync.RWMutex{} @@ -21,7 +24,7 @@ func (m *Map) unlock() { mapLock.Unlock() } -func (m *Map) rlock() { +func (m *Map) rLock() { mapLock.RLock() } @@ -38,13 +41,62 @@ func (m *Map) Exist(key string) bool { if nil == m { return false } - m.rlock() - defer m.unlock() + m.rLock() + defer m.rUnlock() v := *m _, exist := v[key] return exist } +// Get ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 14:41 2024/11/19 +func (m *Map) Get(field string) (any, error) { + if nil == m { + return nil, errors.New("map is nil") + } + m.rLock() + defer m.rUnlock() + v := *m + val, exist := v[field] + if !exist { + return nil, errors.New(field + " : field not found") + } + return val, nil +} + +// GetDefault 获取指定字段, 不存在则设置默认值 +// +// 参数说明: +// - field : 要读取的字段 +// - defaultValue : 字段不存在返回的默认值 +// - allowNil : 字段存在, 但是值为Nil, 是否是一个合法值 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 14:59 2024/11/19 +func (m *Map) GetDefault(field string, defaultValue any, allowNil bool) any { + if nil == m { + return defaultValue + } + m.rLock() + defer m.rUnlock() + v := *m + val, exist := v[field] + if !exist { + return defaultValue + } + if nil == val { + if allowNil { + return val + } + return defaultValue + } + return val +} + // Value 获取数据值 // // Author : go_developer@163.com<白茶清欢> @@ -67,11 +119,51 @@ func (m *Map) Clone() Map { if nil == m { return newData } - m.rlock() - defer m.unlock() + m.rLock() + defer m.rUnlock() mapValue := m.Value() for k, v := range mapValue { newData[k] = v } return newData } + +// Filter 过滤指定字段 +// +// 参数说明: +// - fieldList : 要保留的字段列表 +// - ignoreNotFound : 指定字段不存在是否忽略,如不忽略, 字段不存在, 将会报错 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 14:40 2024/11/19 +func (m *Map) Filter(fieldList []string, ignoreNotFound bool) (map[string]any, error) { + res := make(map[string]any) + for _, itemField := range fieldList { + if val, err := m.Get(itemField); err == nil { + res[itemField] = val + } else { + if !ignoreNotFound { + return nil, err + } + } + } + return res, nil +} + +// FilterDefault 过滤指定字段, 字段不存储在则用默认值填充 +// +// 参数说明: +// - fieldMap : 查询字段表, key为要查询的字段, value为 字段不存在时返回的默认值 +// - allowNil : 字段存在, 三只值为你来是否是一个合法值 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 15:07 2024/11/19 +func (m *Map) FilterDefault(fieldMap map[string]any, allowNil bool) map[string]any { + res := make(map[string]any) + for itemField, fieldDefaultValue := range fieldMap { + res[itemField] = m.GetDefault(itemField, fieldDefaultValue, allowNil) + } + return res +}