go范型工具库-samber/lo

323 阅读1分钟

samber/lo 库使用方法总结

📌 介绍

samber/lo 是一个基于 Go 1.18+ 泛型的工具库,提供了 mapslicefunctional 等便捷操作,避免了 interface{} 和类型断言问题。

GitHub: github.com/samber/lo

📌 安装

go get github.com/samber/lo

1️⃣ Map 操作

🔹 MapToSlice:将 map 转换为 slice

m := map[int]string{1: "A", 2: "B", 3: "C"}
slice := lo.MapToSlice(m, func(k int, v string) string {
    return fmt.Sprintf("%d-%s", k, v)
})
fmt.Println(slice) // ["1-A", "2-B", "3-C"]

🔹 Entries & FromEntriesmap[]tuple 互转

m := map[string]int{"a": 1, "b": 2}
entries := lo.Entries(m) // [{Key: "a", Value: 1}, {Key: "b", Value: 2}]
newMap := lo.FromEntries(entries) // map["a":1 "b":2]

2️⃣ Slice 操作

🔹 Map:转换 slice

slice := []int{1, 2, 3}
doubled := lo.Map(slice, func(x int, _ int) int { return x * 2 })
fmt.Println(doubled) // [2, 4, 6]

🔹 Filter:筛选 slice

slice := []int{1, 2, 3, 4}
evens := lo.Filter(slice, func(x int, _ int) bool { return x%2 == 0 })
fmt.Println(evens) // [2, 4]

🔹 Compact:移除 nil/zero

slice := []string{"a", "", "b", "c"}
filtered := lo.Compact(slice)
fmt.Println(filtered) // ["a", "b", "c"]

3️⃣ 查找和判断

🔹 Find:查找元素

slice := []string{"apple", "banana", "cherry"}
found, ok := lo.Find(slice, func(s string) bool { return s == "banana" })
fmt.Println(found, ok) // "banana" true

🔹 Contains:检查是否存在

exists := lo.Contains([]int{1, 2, 3}, 2)
fmt.Println(exists) // true

🔹 Uniq:去重

slice := []int{1, 2, 2, 3, 4, 4}
unique := lo.Uniq(slice)
fmt.Println(unique) // [1, 2, 3, 4]

4️⃣ 其他常用功能

🔹 Reduce:归约操作

sum := lo.Reduce([]int{1, 2, 3}, func(acc, item int, _ int) int {
    return acc + item
}, 0)
fmt.Println(sum) // 6

🔹 Shuffle:打乱顺序

shuffled := lo.Shuffle([]int{1, 2, 3, 4})
fmt.Println(shuffled) // 乱序

🔹 Repeat:重复生成 slice

repeated := lo.Repeat(3, "Go")
fmt.Println(repeated) // ["Go" "Go" "Go"]

🔹 Ternary:三元表达式

min := lo.Ternary(5 < 10, 5, 10)
fmt.Println(min) // 5

📌 总结

samber/lo 提供了丰富的功能,极大简化了 slicemap 处理,避免 interface{} 断言问题。

常用方法:

  • MapToSliceMapFilterFindReduce
  • ContainsUniqEntriesFromEntries
  • ShuffleTernary

🚀 推荐使用 samber/lo,代码更简洁、安全、可读性更强!