golang高性能切片操作工具插件库loncha的使用

Golang高性能切片操作工具插件库loncha的使用

loncha是一个高性能的Go语言切片工具库,提供了多种高效的切片操作方法。

安装

go get github.com/kazu/loncha

快速开始

基本使用

首先定义一个结构体类型:

import "github.com/kazu/loncha"

type GameObject struct {
    ID int
    Name string
    Pos []float
}

var objs []GameObject

查找切片中的对象

loncha.Find(&objs, func(i int) bool {
    return objs[i].ID == 6
})

过滤/删除对象

// 过滤对象
loncha.Filter(&objs, func(obj *GameObject) bool {
    return obj.ID == 12
})

// 删除对象
loncha.Delete(&objs, func(i int) bool {
    return objs[i].ID == 555
})

选择对象

// 根据条件查找一个对象
obj, err := Select(&objs, func(i int) bool {
    return slice[i].ID < 50
})

切片操作

// 打乱切片
err = loncha.Shuffle(objs, 2)

// 反转切片
loncha.Reverse(objs)

切片交集

var obj2 []GameObject

// 获取两个切片的交集
intersectedObj := InsertSect(obj, obj2)

// 对切片排序后获取交集
sort.Slice(objs, func(i int) bool {
    return objs[i].ID >= objs[j].ID 
})
sort.Slice(objs2, func(i int) bool {
    return objs[i].ID >= objs[j].ID 
})

intersect2 := IntersectSorted(obj, obj2, func(s []GameObject, i int) int {
    return s[i].ID
})

切片差集

// 获取两个切片的差集
subtractObj := Sub(obj, obj2)

// 对切片排序后获取差集
subtract2 := SubSorted(obj, obj2, func(s []GameObject, i int) int {
    return s[i].ID
})

聚合操作

slice1 := []int{10, 6, 4, 2}

// 对切片元素进行聚合计算
sum := Inject(slice1, func(sum *int, t int) int {
    return *sum + t
})

生成双向链表

定义基础结构

package game_object

import (
    "github.com/kazu/loncha/list_head"

type Player struct {
    ID int
    Name string
    Hp int
    list_head.ListHead
}

生成链表代码

$ go get go get github.com/cheekybits/genny
$ wget -q -O - "https://github.com/kazu/loncha/master/container_list/list.go" | genny gen "ListEntry=Player" > player_list.go
$ wget -q -O - "https://github.com/kazu/loncha/master/container_list/list_test.go" | genny gen "ListEntry=Player" > player_list_test.go

性能基准测试

Uniq操作性能比较

loncha.Uniq-16         	    1000	    997543 ns/op	  548480 B/op	   16324 allocs/op
loncha.UniqWithSort-16 	    1000	   2237924 ns/op	     256 B/op	       7 allocs/op
loncha.UniqWithSort(sort)-16 1000	    260283 ns/op	     144 B/op	       4 allocs/op
hand_Uniq-16                1000	    427765 ns/op	  442642 B/op	       8 allocs/op
hand_Uniq_iface-16          1000	    808895 ns/op	  632225 B/op	    6322 allocs/op
go-funk.Uniq-16             1000	   1708396 ns/op	  655968 B/op	   10004 allocs/op

Filter操作性能比较

loncha.Filter-16         	     100	     89142 ns/op	   82119 B/op	       4 allocs/op
loncha.Filter_pointer-16 	     100	       201 ns/op	       0 B/op	       0 allocs/op
hand_Filter_pointer-16   	     100	     24432 ns/op	   81921 B/op	       1 allocs/op
go-funk.Filter-16        	     100	   2370492 ns/op	  640135 B/op	   20004 allocs/op
go-funk.Filter_pointer-16      100	      1048 ns/op	      64 B/op	       2 allocs/op

从基准测试结果可以看出,loncha在大多数操作上比go-funk等库有更好的性能表现,特别是在内存分配方面有显著优势。


更多关于golang高性能切片操作工具插件库loncha的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能切片操作工具插件库loncha的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


loncha - Go高性能切片操作工具库

loncha 是一个专注于高性能切片操作的 Go 语言库,它提供了一系列优化的切片操作方法,特别适合处理大规模数据集合。下面我将详细介绍 loncha 的主要功能和使用方法。

安装

go get github.com/kazu/loncha

主要特性

  1. 高性能的切片过滤、转换等操作
  2. 内存友好的设计
  3. 简洁的 API 接口
  4. 支持链式调用

核心功能示例

1. 基本过滤

package main

import (
	"fmt"
	"github.com/kazu/loncha"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	people := []Person{
		{"Alice", 25},
		{"Bob", 30},
		{"Charlie", 20},
		{"David", 35},
	}

	// 过滤年龄大于25岁的人
	result := loncha.Filter(people, func(p Person) bool {
		return p.Age > 25
	})

	fmt.Printf("%+v\n", result)
	// 输出: [{Name:Bob Age:30} {Name:David Age:35}]
}

2. 链式操作

func main() {
	people := []Person{
		{"Alice", 25},
		{"Bob", 30},
		{"Charlie", 20},
		{"David", 35},
	}

	// 链式操作: 过滤+排序
	result := loncha.NewSlice(people).
		Filter(func(p Person) bool { return p.Age > 20 }).
		Sort(func(i, j int) bool { return people[i].Age < people[j].Age }).
		Result()

	fmt.Printf("%+v\n", result)
	// 输出: [{Name:Alice Age:25} {Name:Bob Age:30} {Name:David Age:35}]
}

3. 高性能 Map 操作

func main() {
	people := []Person{
		{"Alice", 25},
		{"Bob", 30},
		{"Charlie", 20},
	}

	// 提取所有人的名字
	names := loncha.Map(people, func(p Person) string {
		return p.Name
	})

	fmt.Println(names) // 输出: [Alice Bob Charlie]
}

4. 切片分页

func main() {
	data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	// 获取第2页,每页3条数据
	page := loncha.Paginate(data, 2, 3)

	fmt.Println(page) // 输出: [4 5 6]
}

5. 去重操作

func main() {
	nums := []int{1, 2, 2, 3, 4, 4, 5}

	unique := loncha.Unique(nums)

	fmt.Println(unique) // 输出: [1 2 3 4 5]
}

性能优化技巧

loncha 通过以下方式实现高性能:

  1. 减少内存分配:尽量复用现有切片,避免不必要的内存分配
  2. 内联优化:使用函数内联技术减少函数调用开销
  3. 批量处理:对大数据集采用批量处理策略
  4. 并行处理:部分操作支持并行执行

与标准库对比

相比标准库的 sort 和手动循环,loncha 提供了更简洁的 API 和更好的性能:

// 标准库方式
var filtered []Person
for _, p := range people {
    if p.Age > 25 {
        filtered = append(filtered, p)
    }
}
sort.Slice(filtered, func(i, j int) bool {
    return filtered[i].Age < filtered[j].Age
})

// loncha方式
filtered := loncha.NewSlice(people).
    Filter(func(p Person) bool { return p.Age > 25 }).
    Sort(func(i, j int) bool { return people[i].Age < people[j].Age }).
    Result()

注意事项

  1. 对于小数据集,标准库可能更高效
  2. 某些操作会修改原始切片,必要时请先复制
  3. 复杂操作可能需要组合多个方法

loncha 特别适合处理大规模数据集合,能够显著简化代码并提高性能。对于需要频繁操作切片的场景,它是一个值得考虑的工具库。

回到顶部