golang数据过滤、清理与转换处理插件库filter的使用
golang数据过滤、清理与转换处理插件库filter的使用
filter
是一个用于Golang数据过滤、清理和转换的库。
安装
go get github.com/gookit/filter
快速使用示例
// 基本类型转换
str := filter.MustString(23) // "23"
intVal, err := filter.Int("20") // int(20)
strings := filter.Str2Slice("a,b, c", ",") // []string{"a", "b", "c"}
数据过滤完整示例
package main
import (
"fmt"
"github.com/gookit/filter"
)
func main() {
data := map[string]any{
"name": " inhere ",
"age": "50",
"money": "50.34",
"remember": "yes",
"sub1": []string{"1", "2"},
"tags": "go;lib",
"str1": " word ",
"ids": []int{1, 2, 2, 1},
}
// 创建过滤器实例
f := filter.New(data)
// 添加过滤规则
f.AddRule("money", "float") // 转换为float
f.AddRule("remember", "bool") // 转换为bool
f.AddRule("sub1", "strings2ints") // 字符串切片转int切片
f.AddRule("tags", "str2arr:;") // 字符串按;分割为数组
f.AddRule("ids", "unique") // 去除重复元素
f.AddRule("str1", "ltrim|rtrim") // 去除左右空格
f.AddRule("not-exist", "unique") // 不存在的字段会被忽略
// 添加多个规则
f.AddRules(map[string]string{
"age": "trim|int", // 先去除空格再转int
"name": "trim|ucFirst", // 先去除空格再首字母大写
})
// 应用所有规则
f.Filtering()
// 获取过滤后的数据
newData := f.CleanData()
fmt.Printf("%#v\n", newData)
// 输出结果:
// map[string]interface {}{
// "remember":true,
// "sub1":[]int{1, 2},
// "tags":[]string{"go", "lib"},
// "ids":[]int{2, 1},
// "str1":"word",
// "name":"Inhere",
// "age":50,
// "money":50.34
// }
}
可用过滤器和转换器
基本类型转换
ToBool/Bool(s string) (bool, error)
ToFloat/Float(v interface{}) (float64, error)
ToInt/Int(v interface{}) (int, error)
ToUint/Uint(v interface{}) (uint64, error)
ToInt64/Int64(v interface{}) (int64, error)
ToString/String(v interface{}) (string, error)
MustBool(s string) bool
MustFloat(s string) float64
MustInt(s string) int
MustInt64(s string) int64
MustUint(s string) uint64
MustString(v interface{}) string
字符串处理
Trim(s string, cutSet ...string) string
TrimLeft(s string, cutSet ...string) string
TrimRight(s string, cutSet ...string) string
TrimStrings(ss []string, cutSet ...string) (ns []string)
Substr(s string, pos, length int) string
Lower/Lowercase(s string) string
Upper/Uppercase(s string) string
LowerFirst(s string) string
UpperFirst(s string) string
UpperWord(s string) string
Camel/CamelCase(s string, sep ...string) string
Snake/SnakeCase(s string, sep ...string) string
其他实用功能
Email(s string) string
URLDecode(s string) string
URLEncode(s string) string
EscapeJS(s string) string
EscapeHTML(s string) string
Unique(val interface{}) interface{}
(用于去除重复值,支持[]int
,[]int64
,[]string
)StrToSlice(s string, sep ...string) []string
StrToInts(s string, sep ...string) (ints []int, err error)
StrToTime(s string, layouts ...string) (t time.Time, err error)
StringsToInts(ss []string) (ints []int, err error)
注意事项
如果需要过滤和验证Map、Struct数据,建议使用 gookit/validate 库。
许可证
MIT
更多关于golang数据过滤、清理与转换处理插件库filter的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang数据过滤、清理与转换处理插件库filter的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang数据过滤、清理与转换处理插件库filter使用指南
filter是一个功能强大的Golang数据处理库,专门用于数据过滤、清理和转换操作。下面我将详细介绍其核心功能和使用方法。
安装
go get github.com/goburrow/filter
核心功能
1. 数据过滤
package main
import (
"fmt"
"github.com/goburrow/filter"
)
func main() {
data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
// 过滤偶数
result := filter.Filter(data, func(x int) bool {
return x%2 == 0
})
fmt.Println(result) // 输出: [2 4 6 8 10]
}
2. 数据清理
package main
import (
"fmt"
"github.com/goburrow/filter"
"strings"
)
func main() {
texts := []string{" hello ", " world ", " go ", " "}
// 清理空白字符
cleaned := filter.Map(texts, func(s string) string {
return strings.TrimSpace(s)
})
// 过滤空字符串
cleaned = filter.Filter(cleaned, func(s string) bool {
return s != ""
})
fmt.Println(cleaned) // 输出: ["hello", "world", "go"]
}
3. 数据转换
package main
import (
"fmt"
"github.com/goburrow/filter"
"strconv"
)
func main() {
numbers := []string{"1", "2", "3", "4", "5"}
// 字符串转整数
ints, err := filter.MapE(numbers, func(s string) (int, error) {
return strconv.Atoi(s)
})
if err != nil {
panic(err)
}
fmt.Println(ints) // 输出: [1 2 3 4 5]
// 数值加倍
doubled := filter.Map(ints, func(x int) int {
return x * 2
})
fmt.Println(doubled) // 输出: [2 4 6 8 10]
}
高级功能
1. 链式操作
package main
import (
"fmt"
"github.com/goburrow/filter"
)
func main() {
data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
result := filter.New(data).
Filter(func(x int) bool { return x > 5 }). // 过滤大于5的数
Map(func(x int) int { return x * 2 }). // 数值加倍
Filter(func(x int) bool { return x%3 == 0 }) // 过滤能被3整除的数
fmt.Println(result.Collect()) // 输出: [12 18]
}
2. 自定义过滤器
package main
import (
"fmt"
"github.com/goburrow/filter"
)
// 自定义过滤器 - 过滤素数
func isPrime(n int) bool {
if n <= 1 {
return false
}
for i := 2; i*i <= n; i++ {
if n%i == 0 {
return false
}
}
return true
}
func main() {
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
primes := filter.Filter(numbers, isPrime)
fmt.Println(primes) // 输出: [2 3 5 7]
}
3. 复杂数据结构处理
package main
import (
"fmt"
"github.com/goburrow/filter"
)
type User struct {
Name string
Age int
}
func main() {
users := []User{
{"Alice", 25},
{"Bob", 17},
{"Charlie", 30},
{"David", 16},
}
// 过滤成年用户
adults := filter.Filter(users, func(u User) bool {
return u.Age >= 18
})
// 只保留用户名
names := filter.Map(adults, func(u User) string {
return u.Name
})
fmt.Println(names) // 输出: ["Alice", "Charlie"]
}
性能优化技巧
- 预分配切片容量:对于大数据集,预先分配结果切片容量可以提高性能
- 并行处理:对于CPU密集型操作,考虑使用并行处理
- 避免多次遍历:尽量使用链式操作减少数据遍历次数
package main
import (
"fmt"
"github.com/goburrow/filter"
)
func main() {
// 大数据集处理示例
bigData := make([]int, 0, 1000000)
for i := 0; i < 1000000; i++ {
bigData = append(bigData, i)
}
// 预分配结果切片
result := make([]int, 0, len(bigData)/2)
// 并行处理
filter.FilterParallel(bigData, &result, func(x int) bool {
return x%2 == 0
}, 4) // 使用4个goroutine
fmt.Println(len(result)) // 输出: 500000
}
filter库提供了强大而灵活的数据处理能力,可以大大简化Golang中的数据清洗和转换工作。通过合理使用其各种功能,可以编写出既简洁又高效的数据处理代码。