wrapper/map.go

216 lines
4.1 KiB
Go
Raw Normal View History

// Package wrapper ...
//
// Description : wrapper ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2024-11-06 18:27
package wrapper
2024-11-19 15:12:48 +08:00
import (
"errors"
2024-11-19 15:28:47 +08:00
"reflect"
2024-11-19 15:12:48 +08:00
"sync"
)
var mapLock = &sync.RWMutex{}
type Map map[string]any
func (m *Map) lock() {
mapLock.Lock()
}
func (m *Map) unlock() {
mapLock.Unlock()
}
2024-11-19 15:12:48 +08:00
func (m *Map) rLock() {
mapLock.RLock()
}
func (m *Map) rUnlock() {
mapLock.RUnlock()
}
// Exist key是否存在
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:34 2024/11/6
func (m *Map) Exist(key string) bool {
2024-11-19 15:28:47 +08:00
if m.IsNil() {
return false
}
2024-11-19 15:12:48 +08:00
m.rLock()
defer m.rUnlock()
v := *m
_, exist := v[key]
return exist
}
2024-11-06 19:50:09 +08:00
2024-11-19 15:20:25 +08:00
// Set 设置map的值, 字段如果已存在, 会覆盖
//
// 参数说明:
// - field : 摇摆存的字段
// - value : 字段对应的值
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:16 2024/11/19
func (m *Map) Set(field string, value any) error {
2024-11-19 15:28:47 +08:00
if m.IsNil() {
2024-11-19 15:20:25 +08:00
return errors.New("Map is nil")
}
m.lock()
defer m.unlock()
(*m)[field] = value
return nil
}
2024-11-19 15:28:47 +08:00
// Del 删除指定的字段
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:21 2024/11/19
func (m *Map) Del(field string) {
if m.IsNil() {
return
}
m.lock()
defer m.unlock()
delete(*m, field)
}
// IsNil 判断map是否为nil
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:22 2024/11/19
func (m *Map) IsNil() bool {
if nil == m {
return true
}
return reflect.ValueOf(*m).IsNil()
}
2024-11-19 15:12:48 +08:00
// Get ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 14:41 2024/11/19
func (m *Map) Get(field string) (any, error) {
2024-11-19 15:28:47 +08:00
if m.IsNil() {
2024-11-19 15:12:48 +08:00
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 {
2024-11-19 15:28:47 +08:00
if m.IsNil() {
2024-11-19 15:12:48 +08:00
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
}
2024-11-06 19:50:09 +08:00
// Value 获取数据值
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:39 2024/11/6
func (m *Map) Value() Map {
if nil == m {
return map[string]any{}
}
return *m
}
// Clone 克隆数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:40 2024/11/6
func (m *Map) Clone() Map {
newData := map[string]any{}
2024-11-19 15:28:47 +08:00
if m.IsNil() {
2024-11-06 19:50:09 +08:00
return newData
}
2024-11-19 15:12:48 +08:00
m.rLock()
defer m.rUnlock()
2024-11-06 19:50:09 +08:00
mapValue := m.Value()
for k, v := range mapValue {
newData[k] = v
}
return newData
}
2024-11-19 15:12:48 +08:00
// 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
}