Compare commits

...

16 Commits

Author SHA1 Message Date
28a6c68e38 interface => any 2024-11-01 16:25:29 +08:00
ce2d84d282 update serialize 2024-10-24 21:43:52 +08:00
e2a2e6a3c2 增加合并数据方法 2024-03-11 11:08:08 +08:00
9120cd2c68 fix npe 2024-03-08 16:35:03 +08:00
ee1ff53593 fix 2024-03-08 16:32:53 +08:00
5a2df69ffe Merge pull request '增加数据过滤实现' (#2) from featuer/filter into master
Reviewed-on: #2
2024-03-08 16:31:02 +08:00
d5d65c366b 增加数据过滤实现 2024-03-08 16:30:30 +08:00
a87a97b0e8 增加计算元素数量方法 2024-01-30 14:22:51 +08:00
804bc98227 修复读写锁错位问题 2023-12-29 11:21:22 +08:00
489e31b07a update lock && normal 2023-12-24 22:51:41 +08:00
1e39d020ed 升级EasyMap 2023-12-24 22:44:07 +08:00
d43d18b1b2 升级分片map 2023-12-24 22:10:47 +08:00
68e33b965b 升级NewNormal与NewSync 2023-12-14 16:08:59 +08:00
7439281703 update go mod 2023-12-14 15:51:34 +08:00
90f7ba5914 修复序列化不支持map[interface{}]interfave{}的问题 2023-08-26 23:20:35 +08:00
0c8a013bdb map增加toString 2023-08-15 20:46:43 +08:00
10 changed files with 523 additions and 924 deletions

View File

@ -13,29 +13,38 @@ package easymap
//
// Date : 9:56 下午 2021/2/23
type EasyMap interface {
Get(key interface{}) (interface{}, error)
GetWithReceiver(key interface{}, dest interface{}) error
GetUint(key interface{}) (uint, error)
GetUint8(key interface{}) (uint8, error)
GetUint16(key interface{}) (uint16, error)
GetUint32(key interface{}) (uint32, error)
GetUint64(key interface{}) (uint64, error)
GetInt(key interface{}) (int, error)
GetInt8(key interface{}) (int8, error)
GetInt16(key interface{}) (int16, error)
GetInt32(key interface{}) (int32, error)
GetInt64(key interface{}) (int64, error)
GetFloat32(key interface{}) (float32, error)
GetFloat64(key interface{}) (float64, error)
GetBool(key interface{}) (bool, error)
GetString(key interface{}) (string, error)
Set(key interface{}, value interface{})
Del(key interface{})
Exist(key interface{}) bool
GetAll() map[interface{}]interface{}
GetAllForMapKeyString() map[string]interface{}
Get(key any) (any, bool)
GetWithReceiver(key any, dest any) error
GetUint(key any) (uint, error)
GetUint8(key any) (uint8, error)
GetUint16(key any) (uint16, error)
GetUint32(key any) (uint32, error)
GetUint64(key any) (uint64, error)
GetInt(key any) (int, error)
GetInt8(key any) (int8, error)
GetInt16(key any) (int16, error)
GetInt32(key any) (int32, error)
GetInt64(key any) (int64, error)
GetFloat32(key any) (float32, error)
GetFloat64(key any) (float64, error)
GetBool(key any) (bool, error)
GetString(key any) (string, error)
Set(key any, value any)
Del(key any)
Exist(key any) bool
Count() int
GetAll() map[any]any
GetAllForMapKeyString() map[string]any
// Merge 合并数据
Merge(mergeData ...EasyMap)
// MergeWithReceiver 合并数据并转换
MergeWithReceiver(receiver any, mergeData ...EasyMap) error
// Iterator 对数据的迭代
Iterator(IteratorFunc)
// ToStruct 转换成结构体
ToStruct(receiver interface{}) error
ToStruct(receiver any) error
// ToString 转为字符串
ToString() string
// Filter 过滤数据
Filter(ignoreFieldList []string, rewriteFieldTable map[string]string) map[string]any
}

434
common.go Normal file
View File

@ -0,0 +1,434 @@
// Package easymap ...
//
// Description : easymap ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-12-14 15:51
package easymap
import (
"encoding/json"
"errors"
"fmt"
"git.zhangdeman.cn/zhangdeman/serialize"
"git.zhangdeman.cn/zhangdeman/util"
"sync"
)
// common 公共基础结构
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:52 2023/12/14
type common struct {
normalDataTable []map[any]any // 普通数组
syncMapDataTable []sync.Map // sync_map类型
dataTableType string // 数据表类型
segment int // 分片熟练
lock *sync.RWMutex // 数据锁
}
// initLock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:25 2023/12/24
func (c *common) initLock() {
if c.dataTableType == normalDataTableType {
c.lock = &sync.RWMutex{}
}
}
// Lock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:27 2023/12/24
func (c *common) Lock() {
if nil == c.lock {
return
}
c.lock.Lock()
}
// Unlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:27 2023/12/24
func (c *common) Unlock() {
if nil == c.lock {
return
}
c.lock.Unlock()
}
// RLock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:43 2023/12/24
func (c *common) RLock() {
if nil == c.lock {
return
}
c.lock.RLock()
}
// RUnlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:43 2023/12/24
func (c *common) RUnlock() {
if nil == c.lock {
return
}
c.lock.RUnlock()
}
func (c *common) Get(key any) (any, bool) {
segmentIndex := util.Hash.GetHashIDMod(key, c.segment)
c.RLock()
defer c.RUnlock()
if c.dataTableType == normalDataTableType {
data, exist := c.normalDataTable[segmentIndex][key]
return data, exist
} else {
// sync map
return c.syncMapDataTable[segmentIndex].Load(key)
}
}
func (c *common) GetWithReceiver(key any, dest any) error {
if nil == dest {
return errors.New("dest is nil")
}
val, exist := c.Get(key)
if !exist {
return fmt.Errorf("key %v not exist", key)
}
if nil == val {
return errors.New("value is nil")
}
return util.ConvertAssign(dest, val)
}
func (c *common) GetUint(key any) (uint, error) {
var (
val uint
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetUint8(key any) (uint8, error) {
var (
val uint8
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetUint16(key any) (uint16, error) {
var (
val uint16
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetUint32(key any) (uint32, error) {
var (
val uint32
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetUint64(key any) (uint64, error) {
var (
val uint64
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetInt(key any) (int, error) {
var (
val int
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetInt8(key any) (int8, error) {
var (
val int8
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetInt16(key any) (int16, error) {
var (
val int16
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetInt32(key any) (int32, error) {
var (
val int32
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetInt64(key any) (int64, error) {
var (
val int64
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetFloat32(key any) (float32, error) {
var (
val float32
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetFloat64(key any) (float64, error) {
var (
val float64
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetBool(key any) (bool, error) {
var (
val bool
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) GetString(key any) (string, error) {
var (
val string
err error
)
err = c.GetWithReceiver(key, &val)
return val, err
}
func (c *common) Set(key any, value any) {
segmentIndex := util.Hash.GetHashIDMod(key, c.segment)
c.Lock()
defer c.Unlock()
if c.dataTableType == normalDataTableType {
c.normalDataTable[segmentIndex][key] = value
} else {
// sync map
c.syncMapDataTable[segmentIndex].Store(key, value)
}
}
func (c *common) Del(key any) {
segmentIndex := util.Hash.GetHashIDMod(key, c.segment)
c.Lock()
defer c.Unlock()
if c.dataTableType == normalDataTableType {
delete(c.normalDataTable[segmentIndex], key)
} else {
c.syncMapDataTable[segmentIndex].Delete(key)
}
}
func (c *common) Exist(key any) bool {
_, exist := c.Get(key)
return exist
}
// Count 计算元素数量
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 14:21 2024/1/30
func (c *common) Count() int {
cnt := 0
c.RLock()
defer c.RUnlock()
for i := 0; i < c.segment; i++ {
cnt = cnt + len(c.normalDataTable[i])
}
return cnt
}
func (c *common) GetAll() map[any]any {
result := make(map[any]any)
c.RLock()
defer c.RUnlock()
for i := 0; i < c.segment; i++ {
if c.dataTableType == normalDataTableType {
for k, v := range c.normalDataTable[i] {
result[k] = v
}
} else {
c.syncMapDataTable[i].Range(func(key, value any) bool {
result[key] = value
return true
})
}
}
return result
}
// GetAllForMapKeyString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 9:48 下午 2021/9/15
func (c *common) GetAllForMapKeyString() map[string]any {
fullData := c.GetAll()
finalData := make(map[string]any)
for k, v := range fullData {
finalData[fmt.Sprintf("%v", k)] = v
}
return finalData
}
// Iterator ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:32 2023/3/7
func (c *common) Iterator(handleFunc IteratorFunc) {
if nil == handleFunc {
return
}
c.Lock()
c.Unlock()
isBreak := false
for i := 0; i < c.segment; i++ {
if c.dataTableType == normalDataTableType {
for k, v := range c.normalDataTable[i] {
if !handleFunc(k, v) {
isBreak = true
break
}
}
if isBreak {
break
}
} else {
c.syncMapDataTable[i].Range(func(key, value any) bool {
return handleFunc(key, value)
})
}
}
}
// ToStruct ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:42 2023/8/10
func (c *common) ToStruct(receiver any) error {
if nil == receiver {
return errors.New("receiver is nil")
}
mapData := c.GetAll()
byteData, err := json.Marshal(mapData)
if nil != err {
return err
}
return serialize.JSON.UnmarshalWithNumber(byteData, receiver)
}
// ToString 转字符串
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 20:44 2023/8/15
func (c *common) ToString() string {
mapData := c.GetAllForMapKeyString()
return serialize.JSON.MarshalForStringIgnoreError(mapData)
}
// Filter 对数据进行过滤
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:25 2024/3/8
func (c *common) Filter(ignoreFieldList []string, rewriteFieldTable map[string]string) map[string]any {
if nil == ignoreFieldList {
ignoreFieldList = make([]string, 0)
}
if nil == rewriteFieldTable {
rewriteFieldTable = make(map[string]string)
}
result := make(map[string]any)
ignoreFieldTable := make(map[string]bool)
for _, item := range ignoreFieldList {
ignoreFieldTable[item] = true
}
data := c.GetAllForMapKeyString()
for field, val := range data {
if _, exist := ignoreFieldTable[field]; exist {
// 忽略当前字段
continue
}
if rewriteField, exist := rewriteFieldTable[field]; exist && len(rewriteField) > 0 {
field = rewriteField
}
result[field] = val
}
return result
}
// Merge 合并数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:01 2024/3/11
func (c *common) Merge(mergeData ...EasyMap) {
for _, itemData := range mergeData {
allData := itemData.GetAll()
for k, v := range allData {
c.Set(k, v)
}
}
}
// MergeWithReceiver 合并并转换
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:06 2024/3/11
func (c *common) MergeWithReceiver(receiver any, mergeData ...EasyMap) error {
c.Merge(mergeData...)
if nil == receiver {
return nil
}
return c.ToStruct(receiver)
}

View File

@ -8,4 +8,9 @@
package easymap
// IteratorFunc 迭代函数, 返回值为是否继续迭代true 继续迭代 false 终止后续迭代
type IteratorFunc func(key interface{}, value interface{}) bool
type IteratorFunc func(key any, value any) bool
const (
normalDataTableType = "NORMAL"
syncMapDataTableType = "SYNC_MAP"
)

View File

@ -17,7 +17,7 @@ import (
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:17 下午 2021/2/23
func keyNotFound(key interface{}) error {
func keyNotFound(key any) error {
return fmt.Errorf("%v 未找到", key)
}

12
go.mod
View File

@ -1,11 +1,17 @@
module git.zhangdeman.cn/zhangdeman/easymap
go 1.20
go 1.21
require git.zhangdeman.cn/zhangdeman/util v0.0.0-20230811070456-d6a489d5860b
toolchain go1.21.5
require (
github.com/BurntSushi/toml v1.3.2 // indirect
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241023104258-2e0a298aa558
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e
)
require (
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241023090605-10cff9173059 // indirect
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/Jeffail/gabs v1.4.0 // indirect
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1 // indirect

14
go.sum
View File

@ -1,9 +1,23 @@
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20230815040024-2b12dd51d19b h1:C7KftnLh7dOqzNRs5dn/9yqMDvuqMn5RCglvV6bY758=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20230815040024-2b12dd51d19b/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241023090605-10cff9173059 h1:TPAYdTKKUjgxtCnK38d1Tb4teyQp1C7wYHPdR32yZtM=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241023090605-10cff9173059/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20231224125439-01f39b6ea08d h1:TV0BCQQewBEtLsv3i9gXkxLFd5A5bWBTiNd3D/I5o4Q=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20231224125439-01f39b6ea08d/go.mod h1:w7kG4zyTJ1uPFaTWhze+OQuaUBINT2XnDxpyiM6ctc0=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241023104258-2e0a298aa558 h1:ZVJyyDKfYeA3TsN8UOi4IprkouK4wIIfCKe+F9byLWA=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241023104258-2e0a298aa558/go.mod h1:/9eicss/Dt9tp2jwZ/4cXDqDKo/Dez+HuT5/NGdqW+s=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20230810063945-842592611562 h1:wo0r4mexqkPzQ1SZOw5z8A7FJ3ne1G6A/qWR3iaqlhw=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20230810063945-842592611562/go.mod h1:trYFOShINaQBvinQrH4A0G2kfL22Y2lygEcAiGDt/sc=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20230811070456-d6a489d5860b h1:vnmxYrNdX6f5sEVjjkM1fIR+i32kHJ4g9DJqug9KKek=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20230811070456-d6a489d5860b/go.mod h1:Yum5+tgP+Wf1GWUAyQz1Qh8Ab9m5+90GYkYdzqVs0lA=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20231014142840-445c6407db92 h1:p1GVRYJc3NNoZeLs4CukitAbM3O/ALNq3l31cnbBQDM=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20231014142840-445c6407db92/go.mod h1:6OBeuwKy2J1TjdAwStEyC6aYC3kStmJiCg1eFC7g0fk=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI=
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=
github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=

315
normal.go
View File

@ -7,323 +7,12 @@
// Date : 2021-02-23 10:03 下午
package easymap
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"sync"
"git.zhangdeman.cn/zhangdeman/util"
)
// NewNormal 获取map实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:07 下午 2021/2/23
func NewNormal(withLock bool) EasyMap {
em := &normal{
data: make(map[interface{}]interface{}),
withLock: withLock,
}
if withLock {
em.lock = &sync.RWMutex{}
}
func NewNormal() EasyMap {
em, _ := NewSegment(1)
return em
}
// normal 普通map,内部可以加锁
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:03 下午 2021/2/23
type normal struct {
data map[interface{}]interface{}
withLock bool
lock *sync.RWMutex
}
func (n *normal) Get(key interface{}) (interface{}, error) {
if !n.Exist(key) {
return nil, keyNotFound(key)
}
n.RLock()
defer n.RUnlock()
return n.data[key], nil
}
func (n *normal) GetWithReceiver(key interface{}, dest interface{}) error {
var (
val interface{}
err error
)
if val, err = n.Get(key); nil != err {
return err
}
return convertFail(util.ConvertAssign(dest, val))
}
func (n *normal) GetUint(key interface{}) (uint, error) {
var (
result uint
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetUint8(key interface{}) (uint8, error) {
var (
result uint8
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetUint16(key interface{}) (uint16, error) {
var (
result uint16
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetUint32(key interface{}) (uint32, error) {
var (
result uint32
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetUint64(key interface{}) (uint64, error) {
var (
result uint64
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetInt(key interface{}) (int, error) {
var (
result int
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetInt8(key interface{}) (int8, error) {
var (
result int8
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetInt16(key interface{}) (int16, error) {
var (
result int16
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetInt32(key interface{}) (int32, error) {
var (
result int32
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetInt64(key interface{}) (int64, error) {
var (
result int64
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetFloat32(key interface{}) (float32, error) {
var (
result float32
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetFloat64(key interface{}) (float64, error) {
var (
result float64
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (n *normal) GetBool(key interface{}) (bool, error) {
var (
result bool
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return false, err
}
return result, nil
}
func (n *normal) GetString(key interface{}) (string, error) {
var (
result string
err error
)
if err = n.GetWithReceiver(key, &result); nil != err {
return "", err
}
return result, nil
}
func (n *normal) Set(key interface{}, value interface{}) {
n.Lock()
defer n.Unlock()
n.data[key] = value
}
func (n *normal) Del(key interface{}) {
n.Lock()
defer n.Unlock()
delete(n.data, key)
}
func (n *normal) Exist(key interface{}) bool {
n.RLock()
defer n.RUnlock()
_, exist := n.data[key]
return exist
}
// GetAll 读取全部数据使用的是原始数据深拷贝
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:36 下午 2021/2/23
func (n *normal) GetAll() map[interface{}]interface{} {
result := make(map[interface{}]interface{})
n.RLock()
defer n.RUnlock()
for key, val := range n.data {
result[key] = val
}
return result
}
func (n *normal) RLock() {
if n.withLock {
n.lock.RLock()
}
}
func (n *normal) RUnlock() {
if n.withLock {
n.lock.RUnlock()
}
}
func (n *normal) Lock() {
if n.withLock {
n.lock.Lock()
}
}
func (n *normal) Unlock() {
if n.withLock {
n.lock.Unlock()
}
}
// GetAllForMapKeyString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 9:48 下午 2021/9/15
func (n *normal) GetAllForMapKeyString() map[string]interface{} {
fullData := n.GetAll()
finalData := make(map[string]interface{})
for k, v := range fullData {
finalData[fmt.Sprintf("%v", k)] = v
}
return finalData
}
// Iterator ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:32 2023/3/7
func (n *normal) Iterator(handleFunc IteratorFunc) {
if nil == handleFunc {
return
}
n.RLock()
defer n.RUnlock()
for key, val := range n.data {
if !handleFunc(key, val) {
// 终止迭代
break
}
}
}
// ToStruct map转为结构体
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:33 2023/8/10
func (n *normal) ToStruct(receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
mapData := n.GetAll()
byteData, err := json.Marshal(mapData)
if nil != err {
return err
}
decoder := json.NewDecoder(bytes.NewReader(byteData))
decoder.UseNumber()
return decoder.Decode(receiver)
}

View File

@ -7,196 +7,32 @@
// Date : 2021-02-23 10:47 下午
package easymap
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"git.zhangdeman.cn/zhangdeman/util"
)
// NewSegment 获取分段map实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:05 下午 2021/2/24
func NewSegment(segmentCnt int, withLock bool) (EasyMap, error) {
func NewSegment(segmentCnt int) (EasyMap, error) {
if segmentCnt <= 0 {
return nil, segmentError()
}
em := &segment{
segment: segmentCnt,
&common{
normalDataTable: nil,
syncMapDataTable: nil,
dataTableType: normalDataTableType,
segment: segmentCnt,
lock: nil,
},
}
em.dataTable = make([]EasyMap, segmentCnt)
em.normalDataTable = make([]map[any]any, segmentCnt)
for i := 0; i < segmentCnt; i++ {
em.dataTable[i] = NewNormal(withLock)
em.normalDataTable[i] = make(map[any]any)
}
em.common.initLock()
return em, nil
}
type segment struct {
dataTable []EasyMap
segment int
}
func (s *segment) Get(key interface{}) (interface{}, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].Get(key)
}
func (s *segment) GetWithReceiver(key interface{}, dest interface{}) error {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetWithReceiver(key, dest)
}
func (s *segment) GetUint(key interface{}) (uint, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetUint(key)
}
func (s *segment) GetUint8(key interface{}) (uint8, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetUint8(key)
}
func (s *segment) GetUint16(key interface{}) (uint16, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetUint16(key)
}
func (s *segment) GetUint32(key interface{}) (uint32, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetUint32(key)
}
func (s *segment) GetUint64(key interface{}) (uint64, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetUint64(key)
}
func (s *segment) GetInt(key interface{}) (int, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetInt(key)
}
func (s *segment) GetInt8(key interface{}) (int8, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetInt8(key)
}
func (s *segment) GetInt16(key interface{}) (int16, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetInt16(key)
}
func (s *segment) GetInt32(key interface{}) (int32, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetInt32(key)
}
func (s *segment) GetInt64(key interface{}) (int64, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetInt64(key)
}
func (s *segment) GetFloat32(key interface{}) (float32, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetFloat32(key)
}
func (s *segment) GetFloat64(key interface{}) (float64, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetFloat64(key)
}
func (s *segment) GetBool(key interface{}) (bool, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetBool(key)
}
func (s *segment) GetString(key interface{}) (string, error) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].GetString(key)
}
func (s *segment) Set(key interface{}, value interface{}) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
s.dataTable[segmentIndex].Set(key, value)
}
func (s *segment) Del(key interface{}) {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
s.dataTable[segmentIndex].Del(key)
}
func (s *segment) Exist(key interface{}) bool {
segmentIndex := util.Hash.GetHashIDMod(key, s.segment)
return s.dataTable[segmentIndex].Exist(key)
}
func (s *segment) GetAll() map[interface{}]interface{} {
result := make(map[interface{}]interface{})
for i := 0; i < s.segment; i++ {
for k, v := range s.dataTable[i].GetAll() {
result[k] = v
}
}
return result
}
// GetAllForMapKeyString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 9:48 下午 2021/9/15
func (s *segment) GetAllForMapKeyString() map[string]interface{} {
fullData := s.GetAll()
finalData := make(map[string]interface{})
for k, v := range fullData {
finalData[fmt.Sprintf("%v", k)] = v
}
return finalData
}
// Iterator ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:32 2023/3/7
func (s *segment) Iterator(handleFunc IteratorFunc) {
if nil == handleFunc {
return
}
isBreak := false
for i := 0; i < s.segment; i++ {
for k, v := range s.dataTable[i].GetAll() {
if !handleFunc(k, v) {
isBreak = true
break
}
}
if isBreak {
break
}
}
}
// ToStruct ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:42 2023/8/10
func (s *segment) ToStruct(receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
mapData := s.GetAll()
byteData, err := json.Marshal(mapData)
if nil != err {
return err
}
decoder := json.NewDecoder(bytes.NewReader(byteData))
decoder.UseNumber()
return decoder.Decode(receiver)
*common
}

View File

@ -7,265 +7,7 @@
// Date : 2021-02-24 2:08 下午
package easymap
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"sync"
"git.zhangdeman.cn/zhangdeman/util"
)
func NewSync() EasyMap {
return &syncMap{}
}
type syncMap struct {
data sync.Map
}
func (s *syncMap) Get(key interface{}) (interface{}, error) {
val, exist := s.data.Load(key)
if !exist {
return nil, keyNotFound(key)
}
return val, nil
}
func (s *syncMap) GetWithReceiver(key interface{}, dest interface{}) error {
var (
val interface{}
err error
)
if val, err = s.Get(key); nil != err {
return err
}
if err = util.ConvertAssign(dest, val); nil != err {
return convertFail(err)
}
return nil
}
func (s *syncMap) GetUint(key interface{}) (uint, error) {
var (
result uint
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetUint8(key interface{}) (uint8, error) {
var (
result uint8
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetUint16(key interface{}) (uint16, error) {
var (
result uint16
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetUint32(key interface{}) (uint32, error) {
var (
result uint32
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetUint64(key interface{}) (uint64, error) {
var (
result uint64
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetInt(key interface{}) (int, error) {
var (
result int
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetInt8(key interface{}) (int8, error) {
var (
result int8
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetInt16(key interface{}) (int16, error) {
var (
result int16
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetInt32(key interface{}) (int32, error) {
var (
result int32
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetInt64(key interface{}) (int64, error) {
var (
result int64
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetFloat32(key interface{}) (float32, error) {
var (
result float32
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetFloat64(key interface{}) (float64, error) {
var (
result float64
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return 0, err
}
return result, nil
}
func (s *syncMap) GetBool(key interface{}) (bool, error) {
var (
result bool
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return false, err
}
return result, nil
}
func (s *syncMap) GetString(key interface{}) (string, error) {
var (
result string
err error
)
if err = s.GetWithReceiver(key, &result); nil != err {
return "", err
}
return result, nil
}
func (s *syncMap) Set(key interface{}, value interface{}) {
s.data.Store(key, value)
}
func (s *syncMap) Del(key interface{}) {
s.data.Delete(key)
}
func (s *syncMap) Exist(key interface{}) bool {
_, exist := s.data.Load(key)
return exist
}
func (s *syncMap) GetAll() map[interface{}]interface{} {
result := make(map[interface{}]interface{})
s.data.Range(func(key, value interface{}) bool {
result[key] = value
return true
})
return result
}
// GetAllForMapKeyString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 9:48 下午 2021/9/15
func (s *syncMap) GetAllForMapKeyString() map[string]interface{} {
fullData := s.GetAll()
finalData := make(map[string]interface{})
for k, v := range fullData {
finalData[fmt.Sprintf("%v", k)] = v
}
return finalData
}
// Iterator 迭代数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:27 2023/3/7
func (s *syncMap) Iterator(handleFunc IteratorFunc) {
if nil == handleFunc {
return
}
s.data.Range(func(key, value interface{}) bool {
return handleFunc(key, value)
})
}
// ToStruct ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:47 2023/8/10
func (s *syncMap) ToStruct(receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
mapData := s.GetAll()
byteData, err := json.Marshal(mapData)
if nil != err {
return err
}
decoder := json.NewDecoder(bytes.NewReader(byteData))
decoder.UseNumber()
return decoder.Decode(receiver)
em, _ := NewSegmentSync(1)
return em
}

View File

@ -8,12 +8,7 @@
package easymap
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"git.zhangdeman.cn/zhangdeman/util"
"sync"
)
// NewSegmentSync 获取SegmentSync实例
@ -26,153 +21,22 @@ func NewSegmentSync(segment int) (EasyMap, error) {
return nil, segmentError()
}
ss := &segmentSync{
segment: segment,
&common{
normalDataTable: nil,
syncMapDataTable: nil,
dataTableType: syncMapDataTableType,
segment: segment,
lock: nil,
},
}
ss.dataTable = make([]EasyMap, segment)
ss.syncMapDataTable = make([]sync.Map, segment)
for i := 0; i < segment; i++ {
ss.dataTable[i] = NewSync()
ss.syncMapDataTable[i] = sync.Map{}
}
ss.initLock()
return ss, nil
}
type segmentSync struct {
dataTable []EasyMap
segment int
}
func (s *segmentSync) Get(key interface{}) (interface{}, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].Get(key)
}
func (s *segmentSync) GetWithReceiver(key interface{}, dest interface{}) error {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetWithReceiver(key, dest)
}
func (s *segmentSync) GetUint(key interface{}) (uint, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetUint(key)
}
func (s *segmentSync) GetUint8(key interface{}) (uint8, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetUint8(key)
}
func (s *segmentSync) GetUint16(key interface{}) (uint16, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetUint16(key)
}
func (s *segmentSync) GetUint32(key interface{}) (uint32, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetUint32(key)
}
func (s *segmentSync) GetUint64(key interface{}) (uint64, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetUint64(key)
}
func (s *segmentSync) GetInt(key interface{}) (int, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetInt(key)
}
func (s *segmentSync) GetInt8(key interface{}) (int8, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetInt8(key)
}
func (s *segmentSync) GetInt16(key interface{}) (int16, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetInt16(key)
}
func (s *segmentSync) GetInt32(key interface{}) (int32, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetInt32(key)
}
func (s *segmentSync) GetInt64(key interface{}) (int64, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetInt64(key)
}
func (s *segmentSync) GetFloat32(key interface{}) (float32, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetFloat32(key)
}
func (s *segmentSync) GetFloat64(key interface{}) (float64, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetFloat64(key)
}
func (s *segmentSync) GetBool(key interface{}) (bool, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetBool(key)
}
func (s *segmentSync) GetString(key interface{}) (string, error) {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].GetString(key)
}
func (s *segmentSync) Set(key interface{}, value interface{}) {
s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].Set(key, value)
}
func (s *segmentSync) Del(key interface{}) {
s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].Del(key)
}
func (s *segmentSync) Exist(key interface{}) bool {
return s.dataTable[util.Hash.GetHashIDMod(key, s.segment)].Exist(key)
}
func (s *segmentSync) GetAll() map[interface{}]interface{} {
result := make(map[interface{}]interface{})
for i := 0; i < s.segment; i++ {
for k, v := range s.dataTable[i].GetAll() {
result[k] = v
}
}
return result
}
// GetAllForMapKeyString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 9:48 下午 2021/9/15
func (s *segmentSync) GetAllForMapKeyString() map[string]interface{} {
fullData := s.GetAll()
finalData := make(map[string]interface{})
for k, v := range fullData {
finalData[fmt.Sprintf("%v", k)] = v
}
return finalData
}
func (s *segmentSync) Iterator(handleFunc IteratorFunc) {
if nil == handleFunc {
return
}
isBreak := false
for i := 0; i < s.segment; i++ {
for k, v := range s.dataTable[i].GetAll() {
if !handleFunc(k, v) {
isBreak = true
break
}
}
if isBreak {
break
}
}
}
// ToStruct ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:48 2023/8/10
func (s *segmentSync) ToStruct(receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
mapData := s.GetAll()
byteData, err := json.Marshal(mapData)
if nil != err {
return err
}
decoder := json.NewDecoder(bytes.NewReader(byteData))
decoder.UseNumber()
return decoder.Decode(receiver)
*common
}