You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言append空切片的内存分配与循环场景下的写法性能对比

Go语言append空切片的写法对比与性能分析

先看两种写法的代码示例:

写法1:先判断非空再追加

var slice1 []int
for i := 0; i < 1000; i++ {
    slice2 := getSlice() // 可能返回空切片
    if len(slice2) != 0 {
        slice1 = append(slice1, slice2...)
    }
}

写法2:直接追加所有返回的切片

var slice1 []int
for i := 0; i < 1000; i++ {
    slice2 := getSlice() // 可能返回空切片
    slice1 = append(slice1, slice2...)
}

底层逻辑差异

Go的append函数内部会先检查被追加切片的长度:如果slice2的长度为0,append会直接返回原切片slice1,不会执行任何内存分配、元素拷贝操作——这个检查是内置的,开销极低。

性能对比

  • 写法1多了一次手动的len(slice2) != 0判断,这个操作本身非常轻量,但在极端高频的循环(比如千万次以上)中,累计起来会产生微小的性能损耗。
  • 写法2省去了手动判断,直接依赖append内部的空切片检查。由于append是标准库底层实现的,这个内部检查的效率和手动判断相当,甚至可能更优(编译器会做针对性优化)。

为什么你没发现差异?

在普通的循环次数(几千到几万次)下,两种写法的性能差距微乎其微,普通的测试手段根本察觉不到。只有在超大规模的循环场景中,才能测出细微的性能差别。

结论

  • 若优先考虑代码可读性:两种写法都可行,写法1更直观(明确过滤空切片),写法2更简洁。
  • 若追求极致性能:直接用写法2更优,因为append处理空切片的开销几乎可以忽略,反而省去了手动判断的冗余步骤。

内容的提问来源于stack exchange,提问作者MaksimFeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:07:16