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"]
}

性能优化技巧

  1. 预分配切片容量:对于大数据集,预先分配结果切片容量可以提高性能
  2. 并行处理:对于CPU密集型操作,考虑使用并行处理
  3. 避免多次遍历:尽量使用链式操作减少数据遍历次数
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中的数据清洗和转换工作。通过合理使用其各种功能,可以编写出既简洁又高效的数据处理代码。

回到顶部