代码拉取完成,页面将自动刷新
golang工具库
supervalue 通用数据结构,基本支持golang的所有数据结构,提供大量快速处理数据的方法,支持json字符串解析为supervalue
sqlpase 基于supervalue,目标是通过配置或特定的字符串将参数自动转化为sql条件语句,并是实现sql的执行和字段的快速映射
软件架构说明
supervalue
//创建数组
a := NewSVArray()
//默认所有向数组添加的元素的方法会将当前的数据类型转变为数组
//顺序添加元素
a.ArrayAppendValue("abc")
//批量添加
a.ArrayAppendValues("abc", 123, &[]interface{}{1, 2, "efg"}, struct {
Ts int
}{1}, map[int]string{1: "aaa"})
//fmt.Println(a)
//按下标添加
a.SetIndexValue(0, "mn")
//fmt.Println(a)
//对象数组或字符串的长度
fmt.Println(a.Length())
//获取下标元素
s := a.ValueByIndex(0)
fmt.Println("s的值:", s)
//按类型获取下标元素
c := a.AsStringByIndex(2, "")
//或者
d := a.ValueByIndex(2).String()
fmt.Println("c的值:", c, "d的值:", d)
//按浮点型根据指定精度获取下标元素
//四舍五入保留一位小数
a.ValueByIndex(2).Round(1)
//向下取整保留小数点前1位
a.ValueByIndex(2).Ceil(-1)
//向上取整保留小数点前一位
a.ValueByIndex(2).Floor(-1)
//判断元素是否与supervalue等价,可比较复合类型
res := a.ValueByIndex(4).IsEquaEx(map[string]int{"Ts": 1})
fmt.Println(res)
//查找元素在数组中的位置不论层级,不存在时返回nil
aa := a.SearchFilesEX("efg")
//fmt.Println(aa)
//返回当前元素的上级,不存在时返回nil
fmt.Println(aa.Super())
//直接给当前元素赋值,当前元素会根据变量自动转化类型
aa.Super().SetValue(123)
fmt.Println(a)
//将supervalue转化为基本数据结构 map,array和基本数据类型
fmt.Println(a.Interface())
//移除下标元素
fmt.Println(a.RemoveIndexFile(0))
//获取子切片
fmt.Println(a.Child(0, 2))
//创建对象
a := NewSVObject()
//创建对象的同时添加元素
a = NewSVObjByKeyValues("ef", 1234, "abc", "222")
//向对象中添加元素
a.SetKeyValue("a", 123)
//移除键值对
a.RemoveFiles("a")
//批量添加
a.SetKeyValues("a", 123, "e", []string{"123", "456", "345"})
//修改对象键值的名称
a.ChangValueName(func(m map[string]string) {
m["ef"] = "1"
m["abc"] = "2"
})
fmt.Println(a)
//按键值获取对象
a.ValueByName("1")
//按指定类型获取键值
a.StringByName("1", "")
//查找元素在对象中的位置
s := a.SearchKeysEx("1", 1234)
fmt.Println(s, s.Super())
//获取数组或对象中第一个元素和最后一个元素
fmt.Println(a.GetFirstValue(), a.GetLastValue())
//检查指定的键值是否存,不存在时可以创建
a.CheckKeysExists("2;3", func(s string) interface{} {
fmt.Println(s)
return nil
})
//其他
a := NewSVArray().SetValue([]interface{}{"-4", "9", "1", 2, "3", 4.5, 4.5, 2, "3"})
//合并一个数组或对象
a.Merge([]string{"90", "10"})
//去重,对复合类型同样适用
fmt.Println(a.DedupArry())
//遍历数组或对象
a.Range(func(key string, val *SuperValue) bool {
fmt.Println(val)
return true
})
//指定条件获取数组最大值和最小值
fmt.Println(a.Max(0, func(f float64) bool {
if f > 3 {
return false
}
return true
}), a.Min(0, func(f float64) bool {
if f < 2 {
return false
}
return true
}))
//求和,平均
fmt.Println(a.Total(), a.Average())
//按指定条件过滤数组或对象数据求和
fmt.Println(a.TotalByFilterSV(func(s string, value *SuperValue) bool {
if value.Int() > 1 {
return true
}
return false
}))
//数组或对象排序,过滤
fmt.Println(a.Sort(func(key1, key2 string, val1, val2 SuperValue) bool {
return val1.Float64() < val2.Float64()
}).Filter(func(key string, val *SuperValue) bool {
if val.Float64() > 0 {
return true
}
return false
}))
//json解析
str := `{
"code": 0,
"data": [
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
},
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
},
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
},
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
},
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
},
{
"fid": "01\u53F7\u670D",
"fe": "nan",
"fn": "nan",
"fu": "nan"
}
],
"total": 9615
}`
a := NewSVArray()
err := a.JsonParseFromByteEX([]byte(str))
if err != nil {
fmt.Println(err.Error())
return
}
//fmt.Println(a)
as, _ := a.ValueByName("data").DivKDatas("fid,fe", "_", -1, -1)
fmt.Println(as)
sqlparse
str := `{
"a":[1,3,4,5],
"b":"",
"c":"c,c,c",
"d":[],
"e":[1,2,34,4]
}`
data := NewSVArray()
data.JsonParseFromByteEX([]byte(str))
stl := NewSqlParse(data)
/*
语法解析器 注意函数的所有小()变为{} 默认排除所有空字符串
! % ^abc [,1] >=< :func{} % 结束符号[&,|,(,)]|$
取反 前端模糊匹配 字段值 连接符号 数据库字段名称 [数组转化方式 下标]
*/
stl.Table(func(tb *SqlParse) {
tb.Table("efg").Select("*").Set("id=?", nil, 1)
}, "asg").Select().SetStrCondition("(!a%&b)|(c[,0]|!e[1]>=:replace{id,'a',''})*1")
fmt.Println(stl.Res(false))
// 转化sql: select a,b,c,d,e from ( select * from efg where id=? ) asg where ( a not like ? and a not like ? and a not like ? and a not like ? ) or ( c = ? or replace{id,'a',''})*1 <= ? )
// 占位参数: [1 1% 3% 4% 5% c 2]
stl.Clear()
//或者
stl.Table(func(tb *SqlParse) {
tb.Table("efg").Select("*").Set("id=?", nil, 1)
}, "asg").Select().Bracket(func(t *SqlParse) {
t.Set("a", &ParamsConfig{
Negate: true,
SufMatch: true,
Ignore: true,
Index: -1,
}).AndSet("b", NewParamsConfig())
}).OrBracket(func(t *SqlParse) {
t.Set("c", &ParamsConfig{
Index: 0,
Split: []string{","},
Ignore: true,
}).OrSet("e", &ParamsConfig{
Negate: true,
Index: 1,
DBName: " replace{id,'a',''})*1",
})
})
fmt.Print(stl.Res(false))
//测试
str1 := `{
"fid":"1111",
"fpass":"9999"
}`
data1 := NewSVArray()
data1.JsonParseFromByteEX([]byte(str1))
sel := NewSqlParse(data1).ConfigDBCon("mysql", "supportAdmin:Kpl#2023!@tcp(xxxxx:xxxx)/xxxxxx?charset=utf8&parseTime=true&loc=Local")
defer sel.Close()
res := sel.Table("gnss_data").Select("fname,fpassword").Limit("1").OrderBy("fname desc").GroupBy("fname,fpassword").Exec()
fmt.Println(res.ReName("fname", "name").Fileter("fpassword").MapFiles()) //修改字段名称,过滤字段,映射查询结果
fmt.Println(res.Row()) //根据sql的类型结果不同,select 返回结果为数据的总数量,其他返回影响行数
文本编辑功能
a := NewTXSave("ax")
a.Write("abc.txt",[]map[string]int{{"aa":1,"bb":2,"cc":3},{"aa":12,"bb":22,"cc":32}})
a.RemoveKeyValues("abc.txt", func(s string, value *SuperValue) bool {
if value.StringByName("aa","")=="1"{
return true
}
return false
})
a.ReadByFunc("satc2327923279.SIS", func(str string) []string {
l := strings.Split(str, " ")
var res []string
for _, v := range l {
if v != "" {
res = append(res, v)
}
}
return res
}, func(line int, str string) []string {
l := strings.Split(str, " ")
var res []string
for _, v := range l {
if v != "" {
res = append(res, v)
}
}
return append([]string{res[0] + " " + res[1]}, res[2:]...)
})
fmt.Println(a.ReadFile.File)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。