2023-07-21 17:07:04 +08:00
|
|
|
|
package collx
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
2025-05-20 21:04:47 +08:00
|
|
|
|
import (
|
|
|
|
|
|
"database/sql/driver"
|
|
|
|
|
|
"encoding/json"
|
|
|
|
|
|
"mayfly-go/pkg/utils/anyx"
|
|
|
|
|
|
|
2025-06-27 12:17:45 +08:00
|
|
|
|
"github.com/spf13/cast"
|
2025-05-20 21:04:47 +08:00
|
|
|
|
)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
2023-10-12 12:14:56 +08:00
|
|
|
|
// M is a shortcut for map[string]any
|
|
|
|
|
|
type M map[string]any
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
2025-05-20 21:04:47 +08:00
|
|
|
|
// Set 设置key对应的值
|
|
|
|
|
|
func (m *M) Set(key string, val any) {
|
|
|
|
|
|
if *m == nil {
|
|
|
|
|
|
*m = M{}
|
|
|
|
|
|
}
|
|
|
|
|
|
(*m)[key] = val
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetStr 获取key对应的string类型值
|
|
|
|
|
|
func (m M) GetStr(key string) string {
|
|
|
|
|
|
return cast.ToString(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m M) GetStrSlice(key string) []string {
|
|
|
|
|
|
return cast.ToStringSlice(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetInt 获取key对应的int类型值
|
|
|
|
|
|
func (m M) GetInt(key string) int {
|
|
|
|
|
|
return cast.ToInt(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetInt64 获取key对应的int64类型值
|
|
|
|
|
|
func (m M) GetInt64(key string) int64 {
|
|
|
|
|
|
return cast.ToInt64(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m M) GetFloat32(key string) float32 {
|
|
|
|
|
|
return cast.ToFloat32(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m M) GetFloat64(key string) float64 {
|
|
|
|
|
|
return cast.ToFloat64(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m M) GetBool(key string) bool {
|
|
|
|
|
|
return cast.ToBool(m[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************* M db driver *******************/
|
|
|
|
|
|
func (j *M) Scan(value any) error {
|
|
|
|
|
|
if v, ok := value.([]byte); ok && len(v) > 0 {
|
|
|
|
|
|
return json.Unmarshal(v, j)
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m M) Value() (driver.Value, error) {
|
|
|
|
|
|
if m == nil {
|
|
|
|
|
|
return nil, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return json.Marshal(m)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************* map utils *******************/
|
|
|
|
|
|
|
2023-10-12 12:14:56 +08:00
|
|
|
|
// 将偶数个元素转为对应的M (map[string]any)
|
|
|
|
|
|
//
|
|
|
|
|
|
// 偶数索引为key,奇数为value
|
|
|
|
|
|
func Kvs(elements ...any) M {
|
|
|
|
|
|
myMap := make(map[string]any)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
2023-10-12 12:14:56 +08:00
|
|
|
|
for i := 0; i < len(elements); i += 2 {
|
2023-10-20 21:31:46 +08:00
|
|
|
|
key := anyx.ToString(elements[i])
|
2023-10-12 12:14:56 +08:00
|
|
|
|
if i+1 < len(elements) {
|
|
|
|
|
|
value := elements[i+1]
|
|
|
|
|
|
myMap[key] = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
myMap[key] = nil
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return myMap
|
2021-04-16 15:10:07 +08:00
|
|
|
|
}
|
2024-01-23 19:30:28 +08:00
|
|
|
|
|
|
|
|
|
|
// Keys returns the keys of the map m.
|
|
|
|
|
|
// The keys will be in an indeterminate order.
|
|
|
|
|
|
func MapKeys[M ~map[K]V, K comparable, V any](m M) []K {
|
|
|
|
|
|
r := make([]K, 0, len(m))
|
|
|
|
|
|
for k := range m {
|
|
|
|
|
|
r = append(r, k)
|
|
|
|
|
|
}
|
|
|
|
|
|
return r
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Values returns the values of the map m.
|
|
|
|
|
|
// The values will be in an indeterminate order.
|
|
|
|
|
|
func MapValues[M ~map[K]V, K comparable, V any](m M) []V {
|
|
|
|
|
|
r := make([]V, 0, len(m))
|
|
|
|
|
|
for _, v := range m {
|
|
|
|
|
|
r = append(r, v)
|
|
|
|
|
|
}
|
|
|
|
|
|
return r
|
|
|
|
|
|
}
|
2024-03-28 22:20:39 +08:00
|
|
|
|
|
|
|
|
|
|
// MapMerge maps merge, 若存在重复的key,则以最后的map值为准
|
|
|
|
|
|
func MapMerge[M ~map[K]V, K comparable, V any](maps ...M) M {
|
|
|
|
|
|
mergedMap := make(M)
|
|
|
|
|
|
|
|
|
|
|
|
for _, m := range maps {
|
|
|
|
|
|
for k, v := range m {
|
|
|
|
|
|
mergedMap[k] = v
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return mergedMap
|
|
|
|
|
|
}
|