samber/lo 库使用方法总结
📌 介绍
samber/lo 是一个基于 Go 1.18+ 泛型的工具库,提供了 map、slice、functional 等便捷操作,避免了 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 & FromEntries:map 与 []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 提供了丰富的功能,极大简化了 slice、map 处理,避免 interface{} 断言问题。
✅ 常用方法:
MapToSlice、Map、Filter、Find、ReduceContains、Uniq、Entries、FromEntriesShuffle、Ternary
🚀 推荐使用 samber/lo,代码更简洁、安全、可读性更强!