别着急,坐和放宽
使用社交账号登录
funk 包
funk 是一个提供函数式编程工具的 Go 包,类似于 JavaScript 的 Lodash。
go get github.com/thoas/go-funk
import "github.com/thoas/go-funk"
type User struct {
ID int
Name string
Age int
Active bool
}
func funkExamples() {
users := []User{
{ID: 1, Name: "Alice", Age: 25, Active: true},
{ID: 2, Name: "Bob", Age: 30, Active: false},
{ID: 3, Name: "Charlie", Age: 35, Active: true},
}
// 查找元素
user := funk.Find(users, func(u User) bool {
return u.ID == 2
}).(User)
fmt.Println("找到用户:", user.Name)
// 过滤活跃用户
activeUsers := funk.Filter(users, func(u User) bool {
return u.Active
}).([]User)
// 映射到 ID 列表
ids := funk.Map(users, func(u User) int {
return u.ID
}).([]int)
// 检查是否存在
exists := funk.Contains(ids, 2)
fmt.Println("ID 2 存在:", exists)
}
func funkChaining() {
users := []User{
{ID: 1, Name: "Alice", Age: 25, Active: true},
{ID: 2, Name: "Bob", Age: 17, Active: true},
{ID: 3, Name: "Charlie", Age: 35, Active: false},
}
// 链式操作:过滤 + 映射
result := funk.Chain(users).
Filter(func(u User) bool { return u.Age >= 18 }).
Filter(func(u User) bool { return u.Active }).
Map(func(u User) string { return u.Name }).
Value().([]string)
fmt.Println("成年活跃用户:", result)
}
func funkUtilities() {
numbers := []int{1, 2, 2, 3, 4, 4, 5}
// 去重
unique := funk.Uniq(numbers).([]int)
fmt.Println("去重后:", unique) // [1, 2, 3, 4, 5]
// 反转
reversed := funk.Reverse(numbers).([]int)
// 分块
chunks := funk.Chunk(numbers, 2).([][]int)
fmt.Println("分块:", chunks) // [[1,2], [2,3], [4,4], [5]]
// 求和
sum := funk.Sum(numbers)
fmt.Println("总和:", sum)
// 检查全部满足条件
allPositive := funk.Every(numbers, func(n int) bool {
return n > 0
})
// 检查任一满足条件
hasEven := funk.Some(numbers, func(n int) bool {
return n%2 == 0
})
}
// 基准测试
func BenchmarkFunkFind(b *testing.B) {
users := generateUsers(10000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
funk.Find(users, func(u User) bool {
return u.ID == 5000
})
}
}
func BenchmarkNativeFind(b *testing.B) {
users := generateUsers(10000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
for _, u := range users {
if u.ID == 5000 {
break
}
}
}
}
// 典型结果:
// BenchmarkFunkFind-8 20000 85000 ns/op
// BenchmarkNativeFind-8 50000 35000 ns/op
// 原生方式快约 2.4 倍
✅ 推荐使用 funk:
✅ 推荐使用原生遍历:
// 泛型工具函数
func Filter[T any](slice []T, predicate func(T) bool) []T {
result := make([]T, 0)
for _, item := range slice {
if predicate(item) {
result = append(result, item)
}
}
return result
}
func Map[T any, R any](slice []T, mapper func(T) R) []R {
result := make([]R, len(slice))
for i, item := range slice {
result[i] = mapper(item)
}
return result
}
func Find[T any](slice []T, predicate func(T) bool) (T, bool) {
for _, item := range slice {
if predicate(item) {
return item, true
}
}
var zero T
return zero, false
}
// 使用(类型安全 + 性能好)
func main() {
users := []User{{ID: 1}, {ID: 2}}
activeUsers := Filter(users, func(u User) bool {
return u.Active
})
ids := Map(users, func(u User) int {
return u.ID
})
user, found := Find(users, func(u User) bool {
return u.ID == 2
})
}