加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
类_键值表.go 19.51 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
package lin
import (
"encoding/json"
"errors"
"sort"
"time"
// "errors"
// "sort"
"sync"
//"time"
)
type J键值表 struct {
原始数据 map[string]any
读写许可 *sync.RWMutex
}
func NewJ键值表(是否_线程安全 ...bool) (返回_键值表 J键值表) {
if len(是否_线程安全) > 0 && 是否_线程安全[0] {
var sync.RWMutex
返回_键值表.读写许可 = &
}
返回_键值表.原始数据 = make(map[string]any)
return
}
func NewJ键值表_直接赋值(是否_线程安全 bool, 键值 ...any) (返回_键值表 J键值表, 返回错误 error) {
if 是否_线程安全 {
var sync.RWMutex
返回_键值表.读写许可 = &
}
返回_键值表.原始数据 = make(map[string]any)
返回错误 = 返回_键值表.L连续赋值(键值...)
return
}
func ( *J键值表) 初始化() {
if .原始数据 == nil {
.原始数据 = make(map[string]any)
}
}
func ( *J键值表) ZX置线程安全() {
if .读写许可 == nil {
var sync.RWMutex
.读写许可 = &
}
}
// @ 支持 json(字节集的json) && map[string]any && J键值表 && 可以json化的map
func ( *J键值表) ZR载入(载入值 any) (返回_错误 error) {
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make(map[string]any)
switch 当前值 := 载入值.(type) {
case string:
返回_错误 = json.Unmarshal([]byte(当前值), &.原始数据)
return
case []byte:
返回_错误 = json.Unmarshal(当前值, &.原始数据)
return
case map[string]any:
返回_错误 = 键值列表_类型筛选(当前值)
if 返回_错误 != nil {
return
}
新值, err := 键值列表_深拷贝(当前值)
.原始数据, _ = 新值.(map[string]any)
返回_错误 = err
return
case J键值表:
if &.原始数据 == &当前值.原始数据 {
返回_错误 = errors.New("错误:自己不能载入自己")
return
}
.原始数据 = 当前值.D到map()
return
default:
JSON, err := json.Marshal(载入值)
if err != nil {
返回_错误 = err
return
}
返回_错误 = json.Unmarshal([]byte(JSON), &.原始数据)
return
}
}
func ( *J键值表) D到map() (返回_值 map[string]any) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
返回_值, _ = 新值.(map[string]any)
return
}
func ( *J键值表) Q清空() bool {
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make(map[string]any)
return true
}
func ( *J键值表) D到JSON() (返回_值 string) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
转换数据 := 键值列表_JSON之前处理(新值)
JSON, err := json.Marshal(转换数据)
if err != nil {
返回_值 = "{}"
return
}
返回_值 = string(JSON)
return
}
func ( *J键值表) D到新键值表() (返回_值 J键值表) {
返回_值.Q清空()
.初始化()
if .读写许可 != nil {
if &.读写许可 == &返回_值.读写许可 {
return
}
.读写许可.RLock()
defer .读写许可.RUnlock()
}
返回_值.ZR载入(.原始数据)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) Q取值(路径或索引 any, 索引 ...any) (返回_值 any, 返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
返回_值, 返回_错误 = 键值列表_取值(.原始数据, 路径组)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QW取文本(路径或索引 any, 索引 ...any) (返回_值 string) {
, 返回_错误 := .Q取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
返回_值 = any_到文本()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QZ取整数(路径或索引 any, 索引 ...any) (返回_值 int) {
, _ := .Q取值(路径或索引, 索引...)
返回_值 = 全_类型.D到整数()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QX取小数(路径或索引 any, 索引 ...any) (返回_值 float64) {
, _ := .Q取值(路径或索引, 索引...)
返回_值 = 全_类型.D到双精度小数()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QL取逻辑值(路径或索引 any, 索引 ...any) (返回_值 bool) {
, _ := .Q取值(路径或索引, 索引...)
返回_值 = 全_类型.D到逻辑值()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 J键值表 则走 路径+索引 混合
func ( *J键值表) QM取map(路径或索引 any, 索引 ...any) (返回_值 map[string]any) {
, _ := .Q取值(路径或索引, 索引...)
返回_值, _ = .(map[string]any)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QJ取键值表(路径或索引 any, 索引 ...any) (返回_值 J键值表) {
返回_值.Q清空()
, 返回_错误 := .Q取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
// 新值, OK := 值.(map[string]any)
// if !OK {
// return
// }
返回_值.ZR载入()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QQ取切片(路径或索引 any, 索引 ...any) (返回_值 []any) {
, _ := .Q取值(路径或索引, 索引...)
返回_值, _ = .([]any)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) QL取列表(路径或索引 any, 索引 ...any) (返回_值 L列表) {
返回_值.Q清空()
, 返回_错误 := .Q取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
返回_值.ZR载入()
return
// switch 当前值 := 值.(type) {
// case []any:
// 返回_值.ZR载入(当前值)
// return
// default:
// //返回_错误 = errors.New("错误:被取值的类型不是[]any")
// return
// }
}
func ( *J键值表) QZ取字节集(路径或索引 any, 索引 ...any) (返回_值 []byte) {
, 返回_错误 := .Q取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
switch 当前值 := .(type) {
case []byte:
返回_值 = 当前值
return
default:
返回_值 = 全_类型.D到字节集(当前值)
return
}
}
func ( *J键值表) QS取时间日期(路径或索引 any, 索引 ...any) (返回_值 time.Time) {
, 返回_错误 := .Q取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
返回_值 = 全_类型.D到时间()
return
}
func ( *J键值表) QS取数量() int {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
return len(.原始数据)
}
// @ 1为升序 2为降序 空 或者 其它为不排序
func ( *J键值表) QJ取键组(排序方式 ...int) []string {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
jc := 0
键组 := make([]string, len(.原始数据))
for k := range .原始数据 {
键组[jc] = k
jc++
}
if len(排序方式) == 0 {
return 键组
} else if 排序方式[0] == 1 {
sort.Strings(键组)
} else if 排序方式[0] == 2 {
sort.Sort(sort.Reverse(sort.StringSlice(键组)))
}
return 键组
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) Z置值(添加值 any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
if 新值, ok := 添加值.(J键值表); ok {
添加值 = 新值.D到map()
} else if 新值, ok := 添加值.(L列表); ok {
添加值 = 新值.D到切片()
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
返回_错误 = 键值列表_置值(.原始数据, 路径组, 添加值)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZZ置子切片_添加(添加值 any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
if 新值, ok := 添加值.(J键值表); ok {
添加值 = 新值.D到map()
} else if 新值, ok := 添加值.(L列表); ok {
添加值 = 新值.D到切片()
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
返回_错误 = 键值列表_子切片添加值(.原始数据, 路径组, 添加值)
return
}
func ( *J键值表) L连续赋值(键值 ...any) (返回_错误 error) {
.初始化()
if len(键值)%2 != 0 {
返回_错误 = errors.New("错误:键值必须为一键 一值 的 双数")
}
var string
for i, v := range 键值 {
if (i+1)%2 != 0 {
switch 当前值 := v.(type) {
case string:
= 当前值
default:
返回_错误 = errors.New("错误:键值必须为 string")
return
}
} else {
返回_错误 = .Z置值(v, )
if 返回_错误 != nil {
return
}
}
}
return
}
func ( *J键值表) C创建(键值 ...any) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
.原始数据 = make(map[string]any)
.读写许可.Unlock()
} else {
.原始数据 = make(map[string]any)
}
if len(键值)%2 != 0 {
返回_错误 = errors.New("错误:键值必须为一键 一值 的 双数")
return
}
var string
for i, v := range 键值 {
if (i+1)%2 != 0 {
switch 当前值 := v.(type) {
case string:
= 当前值
default:
返回_错误 = errors.New("错误:键值必须为 string")
return
}
} else {
返回_错误 = .Z置值(v, )
if 返回_错误 != nil {
return
}
}
}
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZW置文本(添加值 string, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZZ置整数(添加值 int, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZX置小数(添加值 float64, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZL置逻辑(添加值 bool, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZZ置字节集(添加值 []byte, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZS置时间日期(添加值 time.Time, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZM置map(添加值 map[string]any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
func ( *J键值表) ZJ置键值表(添加值 J键值表, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *J键值表) ZQ置切片(添加值 []any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
func ( *J键值表) ZL置列表(添加值 L列表, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
// 自动会把 []map[string]any 转换成 []any
func ( *J键值表) ZM置map_组(添加值 []map[string]any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .Z置值(添加值, 路径或索引, 索引...)
return
}
func ( *J键值表) S删值(路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
返回值, 返回_错误 := 键值列表_删除值(.原始数据, 路径组)
if , ok := 返回值.(map[string]any); ok && 返回_错误 == nil {
.原始数据 =
}
return
}
func ( *J键值表) ZR载入_重文件(文件路径 string) (返回_错误 error) {
var data []byte
data, 返回_错误 = 全_文件.D读入_文件(文件路径)
if 返回_错误 != nil {
return
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
返回_错误 = json.Unmarshal(data, &.原始数据)
if 返回_错误 != nil {
return
}
return
}
func ( *J键值表) B保存_到文件(文件路径 string) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
转换数据 := 键值列表_JSON之前处理(新值)
JSON, err := json.Marshal(转换数据)
if err != nil {
返回_错误 = err
return
}
返回_错误 = 全_文件.X写到_文件(文件路径, []byte(JSON))
return
}
// 只支 判断持首层键
func ( *J键值表) P判断键_是否存在(键名称 string) (返回_值 bool) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
_, 返回_值 = .原始数据[键名称]
return
}
// @ 1为升序 2为降序 空 或者 其它为不排序
func ( *J键值表) D到表单文本(排序方式 ...int) (返回_值 string) {
排序 := 0
if len(排序方式) > 0 {
排序 = 排序方式[0]
}
键数组 := .QJ取键组(排序)
var 列表 L列表
for _, v := range 键数组 {
提交值 := .QW取文本(v)
列表.T添加值(v + "=" + 提交值)
}
返回_值 = 列表.L连接到文本("&")
return
}
// 把其它键值表的值合并过来 相同的会被替换, 没有的会添加进来
func ( *J键值表) H合并表(参数键值表 J键值表) {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
表数据 := 参数键值表.D到map()
for , := range 表数据 {
.原始数据[] =
}
}
// 把其它键值表的值合并成一个 新的返回表 相同的会被替换, 没有的会添加进来(不影响原表 )
func ( *J键值表) H合并表_成新表(参数键值表 J键值表) (返回表 J键值表, 返回错误 error) {
if &返回表.原始数据 == &.原始数据 || &返回表.原始数据 == &参数键值表.原始数据 {
返回错误 = errors.New("新表 不能是原有表")
return
}
返回表.Q清空()
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
返回表.ZR载入(新值)
表数据 := 参数键值表.D到map()
for , := range 表数据 {
返回表.原始数据[] =
}
return
}
//类似 a=b,c=666 这样的文本 用 , 和 = 分割出表
func ( *J键值表) C重文本分割(文本 string, 表割符 string, 键割符 string) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make(map[string]any)
分割组 := 全_文本.F分割文本(文本, 表割符)
for _, v := range 分割组 {
键值组:=全_文本.F分割文本(v, 键割符)
if len(键值组)!=2{
返回_错误=errors.New("键值不成对")
return
}
.原始数据[键值组[0]]=键值组[1]
}
return
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化