-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmaptools.go
132 lines (120 loc) · 2.53 KB
/
maptools.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package go_utils
import (
"bytes"
"encoding/json"
"fmt"
"reflect"
"regexp"
"strings"
"sync"
)
var rSplt = regexp.MustCompile(`[,; ]`)
func CloneObj[T any](i interface{}) *T {
if data, err := Json.Marshal(i); nil == err {
var m = new(T)
if nil == Json.Unmarshal(data, &m) {
return m
}
}
return nil
}
// copy map
func copyMap(m map[string]string) map[string]string {
m2 := reflect.MakeMap(reflect.TypeOf(m))
for k, v := range m {
m2.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v))
}
return m2.Interface().(map[string]string)
}
// 修改struct 对象 私有成员
func ModifyObj(o interface{}, fld string, v1 interface{}) {
v := reflect.ValueOf(o).Elem()
f := v.FieldByName(fld)
if f.IsValid() && f.CanSet() {
fv := reflect.ValueOf(v1)
if fv.Type().AssignableTo(f.Type()) {
f.Set(fv)
}
}
}
// 移除不要的key
func RmMap(m *map[string]interface{}, a ...string) *map[string]interface{} {
for _, x := range a {
r := rSplt.Split(x, -1)
for _, j := range r {
if j = strings.TrimSpace(j); "" != j {
delete(*m, j)
}
}
}
return m
}
// 多个对象合并
func MergeObjs(i ...interface{}) *map[string]interface{} {
var m1 = map[string]interface{}{}
for _, x := range i {
if data, err := Json.Marshal(x); nil == err {
Json.Unmarshal(data, &m1)
}
}
return &m1
}
func Map2Str(m interface{}) string {
var lk = GetLock("Map2Str").Lock()
defer lk.Unlock()
if data, err := Json.Marshal(m); nil == err {
return string(data)
}
return ""
}
func Any2Str(m interface{}) string {
var lk = GetLock("Any2Str").Lock()
defer lk.Unlock()
if data, err := Json.Marshal(m); nil == err {
return string(data)
}
return ""
}
// 格式化 map 并返回 str
func Map2FormatStr(m interface{}) string {
var lk = GetLock("Map2FormatStr").Lock()
defer lk.Unlock()
if data, err := Json.Marshal(m); nil == err {
var out bytes.Buffer
if nil == json.Indent(&out, data, "", "\t") {
return out.String()
}
}
return ""
}
// 避免重复,并设置标记
func CheckNoRepeat4Onece(m *sync.Map, k interface{}) bool {
if _, ok := m.Load(k); ok {
return true
}
m.Store(k, true)
return false
}
/*
移除空的、无效的值
*/
func RmNullMap(m *map[string]interface{}) *map[string]interface{} {
if nil == m {
return nil
}
var a []string
for k, v := range *m {
if m1, ok := v.(map[string]interface{}); ok {
(*m)[k] = RmNullMap(&m1)
continue
}
s1 := fmt.Sprintf("%v", v)
if nil == v || s1 == "null" || "nil" == s1 || "" == s1 {
a = append(a, k)
}
}
for _, x := range a {
delete(*m, x)
}
return m
}