// Package slicex 基于标准库提供通用切片工具(Go 1.23+)。 // (续上一行) package slicex import ( "slices" ) // Contains 判断 items 中是否包含 v。 func Contains[T comparable](items []T, v T) bool { return slices.Contains(items, v) } // Unique 去除 items 中重复元素,保持首次出现顺序。 func Unique[T comparable](items []T) []T { seen := make(map[T]struct{}, len(items)) out := make([]T, 0, len(items)) for _, v := range items { if _, ok := seen[v]; ok { continue } seen[v] = struct{}{} out = append(out, v) } return out } // Chunk 将 items 切分为最多 size 个元素的子切片, // size <= 0 或 items 为空时返回 nil。 func Chunk[T any](items []T, size int) [][]T { if size <= 0 || len(items) == 0 { return nil } out := make([][]T, 0, (len(items)+size-1)/size) for len(items) > 0 { n := size if len(items) < n { n = len(items) } out = append(out, items[:n]) items = items[n:] } return out } // Map 对每个元素应用 fn 并返回结果。 func Map[T, R any](items []T, fn func(T) R) []R { out := make([]R, len(items)) for i, v := range items { out[i] = fn(v) } return out } // Filter 返回 fn 为 true 的元素,保持原顺序。 func Filter[T any](items []T, fn func(T) bool) []T { out := make([]T, 0, len(items)) for _, v := range items { if fn(v) { out = append(out, v) } } return out }