golang切片操作

在 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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容