在 Go 语言中,切片(slice) 是一种超级灵活且常用的数据结构,它是对底层数组的动态视图。
1. 创建切片
方法一:使用字面量
s := []int{1, 2, 3, 4, 5}
方法二:使用 make
s := make([]int, 5) // 长度为5,容量为5,初始值为0
s := make([]int, 3, 10) // 长度为3,容量为10
方法三:从数组或已有切片截取
arr := [5]int{1, 2, 3, 4, 5}
s := arr[1:4] // s = [2, 3, 4]
s2 := s[1:3] // s2 = [3, 4]
2. 常用操作
获取长度和容量
len(s) // 当前元素个数
cap(s) // 底层数组的容量
追加元素(append)
s = append(s, 6) // 追加一个元素
s = append(s, 7, 8, 9) // 追加多个元素
s = append(s, anotherSlice...) // 追加另一个切片(展开)
注意:如果容量不足,append 会分配新的底层数组并复制数据。
复制切片(copy)
dst := make([]int, len(src))
copy(dst, src)
- copy 返回实际复制的元素个数(取两个切片长度的最小值)。
- 源和目标必须是一样类型的切片。
删除元素(无内置函数,需手动实现)
删除索引 i 的元素:
i := 2
s = append(s[:i], s[i+1:]...)
删除满足条件的元素(保留不满足条件的):
var result []int
for _, v := range s {
if v != target { // 或其他条件
result = append(result, v)
}
}
s = result
或者原地删除(更高效):
j := 0
for _, v := range s {
if v != target {
s[j] = v
j++
}
}
s = s[:j]
3. 切片的“陷阱”与注意事项
共享底层数组
a := []int{1, 2, 3, 4, 5}
b := a[1:3] // b = [2, 3]
b[0] = 99
fmt.Println(a) // 输出 [1, 99, 3, 4, 5] —— a 被修改了!
解决方法:显式复制
b := make([]int, len(a[1:3]))
copy(b, a[1:3])
容量影响行为
s := []int{1, 2, 3, 4, 5}
s = s[:3] // len=3, cap=5
s = append(s, 10)
// 此时 s = [1,2,3,10],但底层数组第4个位置被覆盖(原为4)
4. 遍历切片
for i, v := range s {
fmt.Printf("index=%d, value=%d
", i, v)
}
// 只需要值
for _, v := range s { ... }
// 只需要索引
for i := range s { ... }
5. 切片 vs 数组
|
特性 |
数组 |
切片 |
|
大小 |
固定 |
动态(可增长) |
|
类型 |
[N]T |
[]T |
|
传递方式 |
值传递(复制整个数组) |
引用语义(共享底层数组) |
|
内存布局 |
连续存储 |
指向底层数组的指针 + len + cap |
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END

















暂无评论内容