Go语言标准库确实没有提供专门的切片工具包,但这是有设计考虑的。标准库更倾向于提供基础构建块,让开发者根据具体需求组合使用。不过,有很多优秀的第三方包可以满足你的需求。
标准库的切片操作
Go内置的切片操作已经相当强大:
// 基本的append操作
s := []int{1, 2, 3}
s = append(s, 4) // 追加
s = append([]int{0}, s...) // 前置
// 使用copy进行各种操作
func prepend(slice []int, elements ...int) []int {
return append(elements, slice...)
}
// 过滤
func filter(slice []int, test func(int) bool) []int {
result := make([]int, 0)
for _, v := range slice {
if test(v) {
result = append(result, v)
}
}
return result
}
推荐的第三方包
这是一个功能丰富的切片工具包:
import "github.com/samber/lo"
// 基本操作
numbers := []int{1, 2, 3, 4, 5}
// 过滤
even := lo.Filter(numbers, func(n int, _ int) bool {
return n%2 == 0
})
// 映射
doubled := lo.Map(numbers, func(n int, _ int) int {
return n * 2
})
// 洗牌
shuffled := lo.Shuffle(numbers)
// 去重
unique := lo.Uniq([]int{1, 2, 2, 3, 3, 3})
Go实验性包,未来可能进入标准库:
import "golang.org/x/exp/slices"
// 排序和搜索
names := []string{"Charlie", "Alice", "Bob"}
slices.Sort(names)
// 包含检查
if slices.Contains(names, "Alice") {
// 匹配成功
}
// 比较
equal := slices.Compare([]int{1, 2}, []int{1, 2}) == 0
另一个流行的切片工具包:
import "github.com/elliotchance/pie/v2"
// 各种便捷操作
strings := []string{"a", "b", "c"}
// 前置
prepended := pie.Strings(strings).Prepend("x").JSON()
// 随机元素
random := pie.Strings(strings).Random()
自定义实现示例
对于简单的需求,自己实现也很直接:
// 洗牌功能
func shuffle(slice []int) []int {
result := make([]int, len(slice))
copy(result, slice)
rand.Shuffle(len(result), func(i, j int) {
result[i], result[j] = result[j], result[i]
})
return result
}
// 匹配/查找
func find(slice []string, target string) (int, bool) {
for i, v := range slice {
if v == target {
return i, true
}
}
return -1, false
}
这些工具包都经过了生产环境测试,可以根据项目复杂度选择合适的方案。对于简单操作,标准库组合使用通常足够;复杂场景下,samber/lo或pie都是不错的选择。