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
相关产品推荐
相关产品推荐

