Golang Slice使用技巧

在使用Golang的Slice时,有什么实用的技巧可以分享吗?比如如何高效地追加、删除元素,或者如何避免常见的性能问题?另外,Slice和数组在实际使用中有哪些需要注意的区别?希望能得到一些实战经验和建议。

2 回复
  1. 预分配容量make([]T, 0, cap)减少扩容开销。
  2. 切片截取:注意共享底层数组,可用copy()避免意外修改。
  3. 空切片判断:用len(s)==0而非s==nil
  4. 追加元素append()自动处理扩容,可批量追加。
  5. 遍历优化:用for range避免索引越界。

更多关于Golang Slice使用技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,切片(slice)是动态数组,使用灵活且高效。以下是一些实用技巧:

1. 创建与初始化

  • 直接声明var s []int(nil切片)。
  • 字面量s := []int{1, 2, 3}
  • make函数s := make([]int, 5)(长度5,容量5),或指定容量:make([]int, 3, 10)

2. 切片操作

  • 截取sub := s[1:4](索引1到3)。
  • 省略边界s[:3](从开始到索引2),s[2:](索引2到末尾)。
  • 复制:使用copy(dst, src)避免共享底层数组。

3. 动态扩容

  • 追加元素s = append(s, 4)
  • 合并切片s = append(s, t...)t为另一切片)。
  • 注意:append可能触发重新分配内存,影响性能。

4. 内存优化

  • 预分配容量:若知道大致大小,用make([]int, 0, cap)减少扩容次数。
  • 复用切片:截取至0长度重用底层数组:s = s[:0]

5. 安全使用

  • 避免悬空指针:切片操作后,原数组可能被修改,必要时使用copy
  • 检查空切片:用len(s) == 0而非s == nil(nil切片可安全操作)。

6. 实用代码示例

// 高效过滤元素
func filter(s []int, fn func(int) bool) []int {
    b := s[:0]
    for _, v := range s {
        if fn(v) {
            b = append(b, v)
        }
    }
    return b
}

// 删除元素(无顺序)
func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

掌握这些技巧可提升代码效率和可读性。根据场景选择合适方法,注意性能与内存管理。

回到顶部