map 增加Get与Filter方法
This commit is contained in:
parent
fcaa7ee1c2
commit
51d0a05ec3
104
map.go
104
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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user