2 Star 8 Fork 0

林伟奇思妙想 / lwq

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
L列表.go 26.35 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
package lwq
import (
"encoding/json"
"errors"
"fmt"
"strings"
"sync"
"time"
)
func New_LB_列表(是否_线程安全 ...bool) (返回_列表 LB_列表) {
if len(是否_线程安全) > 0 && 是否_线程安全[0] {
var sync.RWMutex
返回_列表.读写许可 = &
}
返回_列表.原始数据 = make([]any, 0)
返回_列表.已经创建 = true
return
}
type LB_列表 struct {
原始数据 []any
读写许可 *sync.RWMutex
已经创建 bool
}
func ( *LB_列表) 初始化() {
if !.已经创建 && .原始数据 == nil {
.已经创建 = true
.原始数据 = make([]any, 0)
}
}
func ( *LB_列表) ZXC_置线程安全() {
if .读写许可 == nil {
var sync.RWMutex
.读写许可 = &
}
}
// @ 支持 json && []any && LB_列表 &&[]基本类型
func ( *LB_列表) ZR_载入(载入值 any) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make([]any, 0)
switch 当前值 := 载入值.(type) {
case string:
返回_错误 = json.Unmarshal([]byte(当前值), &.原始数据)
return
case []any:
返回_错误 = 键值列表_类型筛选(当前值)
if 返回_错误 != nil {
return
}
新值, _ := 键值列表_深拷贝(当前值)
.原始数据, _ = 新值.([]any)
return
case LB_列表:
if &.原始数据 == &当前值.原始数据 {
返回_错误 = errors.New("错误:自己不能载入自己")
return
}
.原始数据 = 当前值.DQP_到切片()
return
case []int:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []bool:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []float64:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []float32:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []int8:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []int16:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []int32:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []int64:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []uint:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []uint16:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []uint32:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []uint64:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []byte:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []time.Time:
.原始数据 = 列表载入辅助类型转换(当前值)
return
case []string:
.原始数据 = 列表载入辅助类型转换(当前值)
return
}
返回_错误 = errors.New("数据类型错误")
return
}
func 列表载入辅助类型转换[T any](参数 []T) []any {
返回组 := make([]any, len(参数))
for i, v := range 参数 {
返回组[i] = v
}
return 返回组
}
// 列分割符 会将 数据分割成 []any 加了表分割符 会分割成[]map[string]any
func ( *LB_列表) CWB_从文本分割(文本 string, 列分割符 string, 表分割符 ...string) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make([]any, 0)
表分符 := ""
if len(表分割符) > 0 {
表分符 = 表分割符[0]
}
分割组 := 全_文本.FGW_分割文本(文本, 列分割符)
原始数据 := make([]any, len(分割组))
for i, v := range 分割组 {
if 表分符 != "" {
var JZB_键值表
表组 := 全_文本.FGW_分割文本(v, 表分符)
var 转换组 = make([]any, len(表组))
for ii, vv := range 表组 {
转换组[ii] = vv
}
if len(转换组) > 0 {
返回_错误 = .CJ_创建(转换组...)
if 返回_错误 != nil {
return
}
原始数据[i] = .DMA_到map()
} else {
原始数据[i] = .DMA_到map()
}
} else {
原始数据[i] = v
}
}
.原始数据 = 原始数据
return
}
func ( *LB_列表) DQP_到切片() (返回_值 []any) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
返回_值, _ = 新值.([]any)
return
}
func ( *LB_列表) QK_清空() bool {
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
.原始数据 = make([]any, 0)
return true
}
func ( *LB_列表) Djson_到JSON() (返回_值 string) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
转换数据 := 键值列表_JSON之前处理(新值)
JSON, err := json.Marshal(转换数据)
if err != nil {
返回_值 = "[]"
return
}
返回_值 = string(JSON)
return
}
func ( *LB_列表) DXJ_到新列表() (返回_值 LB_列表) {
返回_值.QK_清空()
.初始化()
if .读写许可 != nil {
if &.读写许可 == &返回_值.读写许可 {
return
}
.读写许可.RLock()
defer .读写许可.RUnlock()
}
返回_值.ZR_载入(.原始数据)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QZ_取值(路径或索引 any, 索引 ...any) (返回_值 any, 返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
// 路径 := ""
// if len(索引) > 0 {
// 路径 = 路径或索引 + "." + 全_文本.HBW_合并文本_切片(索引, ".")
// } else {
// 路径 = 路径或索引
// }
// 路径组 := 键值列表_路径分割(路径)
// if len(路径组) == 0 {
// 返回_错误 = errors.New("错误:路径解析错误,路径不能为空")
// return
// }
返回_值, 返回_错误 = 键值列表_取值(.原始数据, 路径组)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QWB_取文本(路径或索引 any, 索引 ...any) (返回_值 string) {
, 返回_错误 := .QZ_取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
返回_值 = any_到文本()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QZS_取整数(路径或索引 any, 索引 ...any) (返回_值 int) {
, _ := .QZ_取值(路径或索引, 索引...)
返回_值 = 全_类型.DZ_到整数()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QXS_取小数(路径或索引 any, 索引 ...any) (返回_值 float64) {
, _ := .QZ_取值(路径或索引, 索引...)
返回_值 = 全_类型.DS_到双精度小数()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QLJ_取逻辑值(路径或索引 any, 索引 ...any) (返回_值 bool) {
, _ := .QZ_取值(路径或索引, 索引...)
返回_值 = 全_类型.DL_到逻辑值()
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 LB_列表 则走 路径+索引 混合
func ( *LB_列表) QMA_取map(路径或索引 any, 索引 ...any) (返回_值 map[string]any) {
, _ := .QZ_取值(路径或索引, 索引...)
返回_值, _ = .(map[string]any)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QJZB_取键值表(路径或索引 any, 索引 ...any) (返回_值 JZB_键值表) {
返回_值.QK_清空()
, 返回_错误 := .QZ_取值(路径或索引, 索引...)
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 ( *LB_列表) QQP_取切片(路径或索引 any, 索引 ...any) (返回_值 []any) {
, _ := .QZ_取值(路径或索引, 索引...)
返回_值, _ = .([]any)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) QLB_取列表(路径或索引 any, 索引 ...any) (返回_值 LB_列表) {
返回_值.QK_清空()
, 返回_错误 := .QZ_取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
switch 当前值 := .(type) {
case []any:
返回_值.ZR_载入(当前值)
return
default:
//返回_错误 = errors.New("错误:被取值的类型不是[]any")
return
}
}
func ( *LB_列表) QZJ_取字节集(路径或索引 any, 索引 ...any) (返回_值 []byte) {
, 返回_错误 := .QZ_取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
switch 当前值 := .(type) {
case []byte:
返回_值 = 当前值
return
default:
返回_值 = 全_类型.DZ_到字节集(当前值)
return
}
}
func ( *LB_列表) QSJ_取时间日期(路径或索引 any, 索引 ...any) (返回_值 time.Time) {
, 返回_错误 := .QZ_取值(路径或索引, 索引...)
if 返回_错误 != nil {
return
}
返回_值 = 全_类型.DS_到时间()
return
}
func ( *LB_列表) QSL_取数量() int {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
return len(.原始数据)
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZZ_置值(添加值 any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
if 新值, ok := 添加值.(JZB_键值表); ok {
添加值 = 新值.DMA_到map()
} else if 新值, ok := 添加值.(LB_列表); ok {
添加值 = 新值.DQP_到切片()
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
// 路径 := ""
// if len(索引) > 0 {
// 路径 = 路径或索引 + "." + 全_文本.HBW_合并文本_切片(索引, ".")
// } else {
// 路径 = 路径或索引
// }
// 路径组 := 键值列表_路径分割(路径)
// if len(路径组) == 0 {
// 返回_错误 = errors.New("错误:路径解析错误,路径不能为空")
// return
// }
返回_错误 = 键值列表_置值(.原始数据, 路径组, 添加值)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZZQP_置子切片_添加(添加值 any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
if 新值, ok := 添加值.(JZB_键值表); ok {
添加值 = 新值.DMA_到map()
} else if 新值, ok := 添加值.(LB_列表); ok {
添加值 = 新值.DQP_到切片()
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
// 路径 := ""
// if len(索引) > 0 {
// 路径 = 路径或索引 + "." + 全_文本.HBW_合并文本_切片(索引, ".")
// } else {
// 路径 = 路径或索引
// }
// 路径组 := 键值列表_路径分割(路径)
// if len(路径组) == 0 {
// 返回_错误 = errors.New("错误:路径解析错误,路径不能为空")
// return
// }
返回_错误 = 键值列表_子切片添加值(.原始数据, 路径组, 添加值)
return
}
// 单个 或 按顺序 连续添加
func ( *LB_列表) TJZ_添加值(添加值 ...any) (返回_错误 error) {
for i, v := range 添加值 {
if 新值, ok := v.(JZB_键值表); ok {
赋值 := 新值.DMA_到map()
添加值[i] = 赋值
返回_错误 = 键值列表_类型筛选(赋值)
if 返回_错误 != nil {
return
}
} else if 新值, ok := v.(LB_列表); ok {
赋值 := 新值.DQP_到切片()
添加值[i] = 赋值
返回_错误 = 键值列表_类型筛选(赋值)
if 返回_错误 != nil {
return
}
} else {
返回_错误 = 键值列表_类型筛选(v)
if 返回_错误 != nil {
return
}
}
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
新值, _ := 键值列表_深拷贝(添加值)
新切片, ok := 新值.([]any)
if !ok {
返回_错误 = errors.New("错误,添加失败")
return
}
.原始数据 = append(.原始数据, 新切片...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZWB_置文本(添加值 string, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZZS_置整数(添加值 int, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZXS_置小数(添加值 float64, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZLJ_置逻辑(添加值 bool, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZZJ_置字节集(添加值 []byte, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZSJ_置时间日期(添加值 time.Time, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZMA_置map(添加值 map[string]any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
func ( *LB_列表) ZJZB_置键值表(添加值 JZB_键值表, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
func ( *LB_列表) ZQP_置切片(添加值 []any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
func ( *LB_列表) ZLB_置列表(添加值 LB_列表, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
// 路径 用 . 分割 自动去除 前后包裹的 [] 如 路径1.路径2.[0].路径4 | 路径1.路径2.0.路径4|路径1.[路径2].0.路径4"
// 索引 如果 后面索引不为空 则走 路径+索引 混合
// 自动会把 []map[string]any 转换成 []any
func ( *LB_列表) ZMAZ_置map组(添加值 []map[string]any, 路径或索引 any, 索引 ...any) (返回_错误 error) {
返回_错误 = .ZZ_置值(添加值, 路径或索引, 索引...)
return
}
func ( *LB_列表) SZ_删值(路径或索引 any, 索引 ...any) (返回_错误 error) {
路径组, err := 值列路径(路径或索引, 索引...)
if err != nil {
返回_错误 = err
return
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
// 路径 := ""
// if len(索引) > 0 {
// 路径 = 路径或索引 + "." + 全_文本.HBW_合并文本_切片(索引, ".")
// } else {
// 路径 = 路径或索引
// }
// 路径组 := 键值列表_路径分割(路径)
// if len(路径组) == 0 {
// 返回_错误 = errors.New("错误:路径解析错误,路径不能为空")
// return
// }
返回值, 返回_错误 := 键值列表_删除值(.原始数据, 路径组)
if , ok := 返回值.([]any); ok && 返回_错误 == nil {
.原始数据 =
}
return
}
func ( *LB_列表) CWJ_重文件_载入(文件路径 string) (返回_错误 error) {
var data []byte
data, 返回_错误 = 全_文件.DR_读入_文件(文件路径)
if 返回_错误 != nil {
return
}
.初始化()
if .读写许可 != nil {
.读写许可.Lock()
defer .读写许可.Unlock()
}
返回_错误 = json.Unmarshal(data, &.原始数据)
if 返回_错误 != nil {
return
}
return
}
func ( *LB_列表) BCD_保存到_文件(文件路径 string) (返回_错误 error) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
新值, _ := 键值列表_深拷贝(.原始数据)
转换数据 := 键值列表_JSON之前处理(新值)
JSON, err := json.Marshal(转换数据)
if err != nil {
返回_错误 = err
return
}
返回_错误 = 全_文件.XD_写到_文件(文件路径, []byte(JSON))
return
}
// 正常支持 列表里套键值表查询 如[]map[] []any 类型查询 默认 键值="索引值" 如 索引值="无敌" and 索引值 !="哈哈"
// @ 逻辑判断符号 支持 "||" or OR, "&& and ADN"
// @ 等式判断符号 支持 "~= LIKE like (包含 支持 单个站位符号 % 如 键 like '%哈哈')",
// "!~= NOTLIKE notlike (包含 支持 单个站位符号 % )", "<=", ">=", "!=", "=", ">", "<"
// @ 运算符 "=", "+", "-", "*", "/", "%"(求余数)
// @ 反回新列表
func (列表 *LB_列表) CX_查询(条件语句 string) (返回_列表 LB_列表, 返回_错误 error) {
返回_列表.QK_清空()
返回_组 := make([]any, 0)
分割条件 := []string{"||", "&&", "(", ")", "!~=", "~=", "<=", ">=", "!=", "=", "+", "-", "*", "/", "%", ">", "<"}
条件切片 := 键值列表_条件分割(条件语句, 分割条件)
for i, v := range 条件切片 {
if v == "and" || v == "ADN" {
条件切片[i] = "&&"
} else if v == "or" || v == "OR" {
条件切片[i] = "||"
} else if v == "NOTLIKE" || v == "notlike" {
条件切片[i] = "!~="
} else if v == "LIKE" || v == "like" {
条件切片[i] = "~="
}
}
列表.初始化()
if 列表.读写许可 != nil {
列表.读写许可.RLock()
defer 列表.读写许可.RUnlock()
}
for _, v := range 列表.原始数据 {
添加组 := make([]string, len(条件切片))
copy(添加组, 条件切片)
switch 当前值 := v.(type) {
case map[string]any:
结果, err := m_map查询_带参数(分割条件, 添加组, 当前值)
if err != nil {
返回_错误 = err
return
}
if 结果 {
返回_组 = append(返回_组, 当前值)
}
default:
新map := map[string]any{"索引值": 当前值}
结果, err := m_map查询_带参数(分割条件, 添加组, 新map)
if err != nil {
返回_错误 = err
return
}
if 结果 {
返回_组 = append(返回_组, 新map)
}
}
}
返回_列表.ZR_载入(返回_组)
return
}
// []any 类型查询 默认 键值="索引值" 如 索引值="无敌" and 索引值 !="哈哈"
// @ 逻辑判断符号 支持 "||" or OR, "&& and ADN"
// @ 等式判断符号 支持 "~= LIKE like (包含 支持 单个站位符号 % 如 键 like '%哈哈')",
// "!~= NOTLIKE notlike (包含 支持 单个站位符号 % )", "<=", ">=", "!=", "=", ">", "<"
// @ 运算符 "=", "+", "-", "*", "/", "%"(求余数)
// @ 位置 如果 没有对应 则返回 -1
func ( *LB_列表) CZ_查找(条件语句 string, 开始位置 ...int) (返回_位置 int, 返回_错误 error) {
判断开始位置 := 0
返回_位置 = -1
if len(开始位置) > 0 {
判断开始位置 = 开始位置[0]
}
分割条件 := []string{"||", "&&", "(", ")", "!~=", "~=", "<=", ">=", "!=", "=", "+", "-", "*", "/", "%", ">", "<"}
条件切片 := 键值列表_条件分割(条件语句, 分割条件)
for i, v := range 条件切片 {
if v == "and" || v == "ADN" {
条件切片[i] = "&&"
} else if v == "or" || v == "OR" {
条件切片[i] = "||"
} else if v == "NOTLIKE" || v == "notlike" {
条件切片[i] = "!~="
} else if v == "LIKE" || v == "like" {
条件切片[i] = "~="
}
}
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
for i, v := range .原始数据 {
添加组 := make([]string, len(条件切片))
copy(添加组, 条件切片)
if i < 判断开始位置 {
continue
}
switch 当前值 := v.(type) {
case map[string]any:
结果, err := m_map查询_带参数(分割条件, 添加组, 当前值)
if err != nil {
返回_错误 = err
return
}
if 结果 {
返回_位置 = i
return
}
default:
新map := map[string]any{"索引值": 当前值}
结果, err := m_map查询_带参数(分割条件, 添加组, 新map)
if err != nil {
返回_错误 = err
return
}
if 结果 {
返回_位置 = i
return
}
}
}
return
}
func ( *LB_列表) CZ_查找_快速(主键名称 string, 查找内容 any, 开始位置 ...int) (返回_位置 int) {
判断开始位置 := 0
返回_位置 = -1
if len(开始位置) > 0 {
判断开始位置 = 开始位置[0]
}
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
for i, v := range .原始数据 {
if i < 判断开始位置 {
continue
}
switch 当前值 := v.(type) {
case map[string]any:
if 新值, ok := 当前值[主键名称]; ok && (新值 == 查找内容 || any_到文本(新值) == any_到文本(查找内容)) {
返回_位置 = i
return
}
}
}
return
}
// 类型 和 数据 完全一致的查找
func ( *LB_列表) CZ_查找_超快速_绝对匹配(主键名称 string, 查找内容 any, 开始位置 ...int) (返回_位置 int) {
判断开始位置 := 0
返回_位置 = -1
if len(开始位置) > 0 {
判断开始位置 = 开始位置[0]
}
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
for i, v := range .原始数据 {
if i < 判断开始位置 {
continue
}
switch 当前值 := v.(type) {
case map[string]any:
if 新值, ok := 当前值[主键名称]; ok && 新值 == 查找内容 {
返回_位置 = i
return
}
}
}
return
}
// @唯一标识的键 就是用哪个键的值做索引 要值求唯一性 否则 会被最后一个 值的值替换
// {唯一标识的键的值:{原来列表数据}} 并且会在原数据键值表添加一个 "原列表位置" 的值 标明数据在原来列表的位置
// 只支持 []map[string]any
func ( *LB_列表) QSY_取索引表(唯一标识的键 string) (返回_值 JZB_键值表, 返回_错误 error) {
返回_值.QK_清空()
返回_值.ZXC_置线程安全()
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
for i, v := range .原始数据 {
switch 当前值 := v.(type) {
case map[string]any:
if , ok := 当前值[唯一标识的键]; ok {
唯一值 := any_到文本()
if 唯一值 != "" {
当前值["原列表位置"] = i
返回_值.ZZ_置值(当前值, 唯一值)
}
} else {
返回_错误 = errors.New("错误:唯一标识的键 出现不存在 ")
return
}
default:
返回_错误 = errors.New("错误:列表值类型错误 必须是 map[string]any")
return
}
}
return
}
func ( *LB_列表) HBD_合并到文本(合并连接符 string) (返回_值 string) {
.初始化()
if .读写许可 != nil {
.读写许可.RLock()
defer .读写许可.RUnlock()
}
切片 := make([]string, len(.原始数据))
for i, v := range .原始数据 {
切片[i] = fmt.Sprintf("%v", v)
}
返回_值 = strings.Join(切片, 合并连接符)
return
}
Go
1
https://gitee.com/mad-wud/lwq.git
git@gitee.com:mad-wud/lwq.git
mad-wud
lwq
lwq
v1.3.3

搜索帮助