Skip to content

切片函数文档索引

函数说明
All返回切片的(key-value)迭代器
Chunk将切片分割成指定大小的块,返回块的迭代器
Clip修剪切片的容量,使其等于长度(释放多余底层数组内存)
Clone创建切片的浅拷贝(新分配内存并复制元素)
Collect从迭代器收集元素到一个新的切片中
Compact移除切片中连续重复的元素,返回压缩后的切片
CompactFunc使用自定义比较函数移除连续重复元素
Compare按字典序比较两个切片,返回 -1, 0, 或 1
CompareFunc使用自定义比较函数比较两个切片
Concat连接多个切片,返回一个新切片
Contains检查切片是否包含指定值
ContainsFunc使用自定义函数检查切片是否包含匹配元素
Delete删除指定索引范围的元素,返回修改后的切片
DeleteFunc删除所有满足指定条件的元素
Equal判断两个切片是否相等(长度相同且对应元素相等)
EqualFunc使用自定义比较函数判断两个切片是否相等
Grow增加切片的容量以预留空间,避免后续追加时重新分配
Index返回值在切片中第一次出现的索引,不存在则返回 -1
Values返回切片的值迭代器(忽略索引)
IndexFunc返回第一个满足条件元素的索引,不存在则返回 -1
Insert在指定位置插入元素,返回新切片
Max返回切片中的最大值
MaxFunc使用自定义比较函数返回最大值
Min返回切片中的最小值
MinFunc使用自定义比较函数返回最小值
Repeat将切片内容重复 n 次,返回新切片
Replace替换指定范围的元素为新元素
Reverse原地反转切片中的元素顺序
Sort原地对切片进行排序(要求元素可比较)
SortFunc使用自定义比较函数原地排序
Sorted返回排序后的新切片(不修改原切片)
SortedFunc使用自定义比较函数返回排序后的新切片
IsSorted检查切片是否已排序
IsSortedFunc使用自定义比较函数检查切片是否已排序

示例代码

go
package main

import (
	"fmt"
	"slices"
)

func main() {
	nums := []int{11, 33, 55}

	// ===== 1. slices.All 方法 =====
	// 输出如下: 说明返回的是一个迭代器指针
	// iter.Seq2[int,int] 	 0x5a14460
	iter := slices.All(nums)
	fmt.Printf("%T \t %v \n", iter, iter)

	// 迭代器是可以被遍历的
	// 0 : 11
	// 1 : 33
	// 2 : 55
	for i, v := range iter {
		fmt.Printf("%v : %v \n", i, v)
	}

	// ===== 2. slices.Chunk 方法 =====
	// 将切片分割成大小为 2 的块
	data := []int{1, 2, 3, 4, 5}
	fmt.Println("\n=== Chunk ===")
	for chunk := range slices.Chunk(data, 2) {
		fmt.Printf("块: %v\n", chunk)
	}
	// 输出:
	// 块: [1 2]
	// 块: [3 4]
	// 块: [5]

	// ===== 3. slices.Clip 方法 =====
	// 修剪容量,使其等于长度
	sliceWithCap := make([]int, 3, 10)
	fmt.Printf("\n=== Clip ===\nBefore: len=%d, cap=%d\n", len(sliceWithCap), cap(sliceWithCap))
	clipped := slices.Clip(sliceWithCap)
	fmt.Printf("After:  len=%d, cap=%d\n", len(clipped), cap(clipped))

	// ===== 4. slices.Clone 方法 =====
	// 创建副本
	original := []int{1, 2, 3}
	clone := slices.Clone(original)
	clone[0] = 99
	fmt.Printf("\n=== Clone ===\nOriginal: %v\nClone:    %v\n", original, clone)

	// ===== 5. slices.Compact 方法 =====
	// 移除连续重复元素
	dup := []int{1, 1, 2, 2, 2, 3, 1}
	compact := slices.Compact(dup)
	fmt.Printf("\n=== Compact ===\nBefore: %v\nAfter:  %v\n", dup, compact)

	// ===== 6. slices.Concat 方法 =====
	// 连接切片
	s1 := []int{1, 2}
	s2 := []int{3, 4}
	concat := slices.Concat(s1, s2)
	fmt.Printf("\n=== Concat ===\nResult: %v\n", concat)

	// ===== 7. slices.Contains 方法 =====
	// 检查是否存在
	has33 := slices.Contains(nums, 33)
	has99 := slices.Contains(nums, 99)
	fmt.Printf("\n=== Contains ===\nHas 33: %v, Has 99: %v\n", has33, has99)

	// ===== 8. slices.Delete 方法 =====
	// 删除索引 1 到 2 (不含2) 的元素,即删除索引1的元素
	delSlice := []int{10, 20, 30, 40}
	deleted := slices.Delete(delSlice, 1, 2)
	fmt.Printf("\n=== Delete ===\nBefore: %v\nAfter:  %v\n", delSlice, deleted)

	// ===== 9. slices.Equal 方法 =====
	// 比较相等
	eq := slices.Equal([]int{1, 2}, []int{1, 2})
	fmt.Printf("\n=== Equal ===\n[1,2] == [1,2]: %v\n", eq)

	// ===== 10. slices.Grow 方法 =====
	// 预分配容量
	growSlice := []int{1}
	grown := slices.Grow(growSlice, 100)
	fmt.Printf("\n=== Grow ===\nNew Cap >= 100: %v\n", cap(grown) >= 100)

	// ===== 11. slices.Index 方法 =====
	// 查找索引
	idx := slices.Index(nums, 55)
	notFound := slices.Index(nums, 100)
	fmt.Printf("\n=== Index ===\nIndex of 55: %v, Index of 100: %v\n", idx, notFound)

	// ===== 12. slices.Insert 方法 =====
	// 插入元素
	insertSlice := []int{1, 2, 4}
	inserted := slices.Insert(insertSlice, 2, 3) // 在索引2处插入3
	fmt.Printf("\n=== Insert ===\nResult: %v\n", inserted)

	// ===== 13. slices.Max / Min 方法 =====
	maxVal := slices.Max(nums)
	minVal := slices.Min(nums)
	fmt.Printf("\n=== Max/Min ===\nMax: %v, Min: %v\n", maxVal, minVal)

	// ===== 14. slices.Reverse 方法 =====
	// 反转 (原地)
	revSlice := []int{1, 2, 3}
	slices.Reverse(revSlice)
	fmt.Printf("\n=== Reverse ===\nResult: %v\n", revSlice)

	// ===== 15. slices.Sort / Sorted 方法 =====
	// Sort 是原地排序
	sortSlice := []int{3, 1, 2}
	slices.Sort(sortSlice)
	fmt.Printf("\n=== Sort (In-place) ===\nResult: %v\n", sortSlice)

	// Sorted 返回新切片
	unsorted := []int{5, 3, 9}
	sortedNew := slices.Sorted(unsorted)
	fmt.Printf("=== Sorted (New) ===\nOriginal: %v, New: %v\n", unsorted, sortedNew)

	// ===== 16. slices.IsSorted 方法 =====
	isSorted := slices.IsSorted(sortedNew)
	fmt.Printf("=== IsSorted ===\nIs [3,5,9] sorted? %v\n", isSorted)
}

Released under the MIT License.