From be72e0b4f929ec62fb58ddbb8f01339de64f0f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sun, 23 Aug 2026 10:36:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B7=A5=E5=85=B7=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=95=B4=E5=90=88=20lancet=20=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 8 ++--- go.sum | 25 ++++---------- op_array/util.go | 88 +++++++++++------------------------------------ op_string/tool.go | 27 +++------------ 4 files changed, 34 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index 32b8bf4..e4675f5 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e - github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 + github.com/duke-git/lancet/v2 v2.3.9 github.com/smartystreets/goconvey v1.8.1 github.com/spaolacci/murmur3 v1.1.0 github.com/stretchr/testify v1.11.1 @@ -27,9 +27,7 @@ require ( github.com/smarty/assertions v1.15.0 // indirect github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tidwall/sjson v1.2.5 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/exp v0.0.0-20221208152030-732eee02a75a // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 07c7879..d26b71c 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,17 @@ -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772 h1:Yo1ur3LnDF5s7F7tpJsNrdUSF8LwYKnN9TdQU32F3eU= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20251101092813-3dd9fb807f1c h1:H0Tlh7i5UtCLwwhPFEqIO7V+vydQ7YgMtPQI7iCxiSI= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20251101092813-3dd9fb807f1c/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= -git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0 h1:gUDlQMuJ4xNfP2Abl1Msmpa3fASLWYkNlqDFF/6GN0Y= -git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI= git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc= git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI= -git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20250504055908-8d68e6106ea9 h1:/GLQaFoLb+ciHOtAS2BIyPNnf4O5ME3AC5PUaJY9kfs= -git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20250504055908-8d68e6106ea9/go.mod h1:ABJ655C5QenQNOzf7LjCe4sSB52CXvaWLX2Zg4uwDJY= git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU= git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd/go.mod h1:pLrQ63JICi81/3w2BrD26QZiu+IpddvEVfMJ6No3Xb4= git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI= git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= -github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/duke-git/lancet/v2 v2.3.9 h1:ZxUvfoEY7YbsGIeoXRxHWIkRCAt6VN7UBKWgCCqBB3U= +github.com/duke-git/lancet/v2 v2.3.9/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -28,8 +22,6 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ= -github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/mozillazg/go-pinyin v0.21.0 h1:Wo8/NT45z7P3er/9YSLHA3/kjZzbLz5hR7i+jGeIGao= github.com/mozillazg/go-pinyin v0.21.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -44,7 +36,6 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= @@ -53,14 +44,10 @@ github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw= +golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/op_array/util.go b/op_array/util.go index 0137d0f..33f4a8f 100644 --- a/op_array/util.go +++ b/op_array/util.go @@ -9,48 +9,37 @@ package op_array import ( "fmt" - "reflect" + + "github.com/duke-git/lancet/v2/convertor" + "github.com/duke-git/lancet/v2/slice" ) // ToMap 数组转map func ToMap[Key comparable, Value any](dataList []Value, keyFormat func(item Value) Key) map[Key]Value { - res := make(map[Key]Value) - for _, item := range dataList { - key := keyFormat(item) - res[key] = item - } - return res + return convertor.ToMap(dataList, func(item Value) (Key, Value) { + return keyFormat(item), item + }) } // ToCustomMap 数组转map func ToCustomMap[Key comparable, Value any, CustomValue any](dataList []Value, keyFormat func(item Value) Key, formatCustomValue func(item Value) CustomValue) map[Key]CustomValue { - res := make(map[Key]CustomValue) - for _, item := range dataList { - key := keyFormat(item) - res[key] = formatCustomValue(item) - } - return res + return convertor.ToMap(dataList, func(item Value) (Key, CustomValue) { + return keyFormat(item), formatCustomValue(item) + }) } // ExtractField 提取数组指定字段, 并构建成一个新的数组 func ExtractField[FieldValue any, Value any](dataList []Value, fieldValue func(item Value) FieldValue) []FieldValue { - res := make([]FieldValue, 0) - for _, item := range dataList { - v := fieldValue(item) - res = append(res, v) - } - return res + return slice.Map(dataList, func(_ int, item Value) FieldValue { + return fieldValue(item) + }) } // Filter 过滤列表数据 func Filter[Value any](dataList []Value, filterValue func(item Value) bool) []Value { - res := make([]Value, 0) - for _, item := range dataList { - if filterValue(item) { - res = append(res, item) - } - } - return res + return slice.Filter(dataList, func(_ int, item Value) bool { + return filterValue(item) + }) } // Group 按照指定字段进行分组 @@ -74,12 +63,9 @@ func Group[Key comparable, Value any](dataList []Value, keyFormat func(item Valu // GroupToMap 数组数据按照指定 key 进行分组 func GroupToMap[Key comparable, Value any](dataList []Value, keyFormat func(item Value) Key) map[Key][]Value { - dataTable := make(map[Key][]Value) - for _, item := range dataList { - key := keyFormat(item) - dataTable[key] = append(dataTable[key], item) - } - return dataTable + return slice.GroupWith(dataList, func(item Value) Key { + return keyFormat(item) + }) } // TreeItem 数据结构 @@ -126,44 +112,10 @@ func Tree[ID comparable, Value any](dataList []Value, formatParentID func(v Valu // DeepClone 深度克隆一个数组, 每一个元素的地址均重新分配 func DeepClone[Value any](dataList []Value) []Value { - v := *new(Value) - vType := reflect.TypeOf(v) - res := make([]Value, len(dataList)) - for i := 0; i < len(dataList); i++ { - newV := new(Value) - switch vType.Kind() { - case reflect.Ptr: - // 解引用, 并单独读取值后重新分配地址 - copyV := reflect.New(vType.Elem()).Elem() - copyV.Set(reflect.ValueOf(dataList[i]).Elem()) - *newV = copyV.Addr().Interface().(Value) - case reflect.Map: - mapVal := reflect.ValueOf(dataList[i]) - mapKeyList := mapVal.MapKeys() - newMap := reflect.MakeMap(vType) - for _, key := range mapKeyList { - // 通过键获取对应的值 - value := mapVal.MapIndex(key) - newMap.SetMapIndex(key, value) - } - *newV = newMap.Interface().(Value) - default: - *newV = dataList[i] - } - res[i] = *newV - } - return res + return convertor.DeepClone(dataList) } // Shard 将数组按照指定数量进行分片 func Shard[Value any](dataList []Value, itemShardCount int) [][]Value { - res := make([][]Value, 0) - for i := 0; i < len(dataList); i += itemShardCount { - tmpList := make([]Value, 0) - for j := 0; j < itemShardCount; j++ { - tmpList = append(tmpList, dataList[i+j]) - } - res = append(res, tmpList) - } - return res + return slice.Chunk(dataList, itemShardCount) } diff --git a/op_string/tool.go b/op_string/tool.go index 886f099..0c2a0ef 100644 --- a/op_string/tool.go +++ b/op_string/tool.go @@ -8,14 +8,13 @@ package op_string import ( - "crypto/md5" - "encoding/hex" - "io" "math/rand" "strings" "time" "git.zhangdeman.cn/zhangdeman/wrapper/define" + "github.com/duke-git/lancet/v2/cryptor" + "github.com/duke-git/lancet/v2/strutil" "github.com/spaolacci/murmur3" ) @@ -58,16 +57,8 @@ func SnakeCaseToCamel(str string) string { // Md5 计算Md5值 func Md5(str string) define.BaseValueResult[string] { - h := md5.New() - _, err := io.WriteString(h, str) - if nil != err { - return define.BaseValueResult[string]{ - Value: "", - Err: err, - } - } return define.BaseValueResult[string]{ - Value: hex.EncodeToString(h.Sum(nil)), + Value: cryptor.Md5String(str), Err: nil, } } @@ -108,10 +99,7 @@ func ReplaceChar(str string, charTable map[string]string) string { if len(charTable) == 0 { return str } - for k, v := range charTable { - str = strings.ReplaceAll(str, k, v) - } - return str + return strutil.ReplaceWithMap(str, charTable) } // HasSubStr 是否包含指定的子串 @@ -119,12 +107,7 @@ func HasSubStr(str string, subStrList []string) bool { if len(subStrList) == 0 { return true } - for _, item := range subStrList { - if strings.Contains(str, item) { - return true - } - } - return false + return strutil.ContainsAny(str, subStrList) } // HashNumber 生成字符串哈希值