Go语言中slice[0:0]语法的作用是什么?
Go切片语法
blankLines = blankLines[0:0]作用解答
blankLines = blankLines[0:0]不是向数组头部追加元素的写法,它的作用是清空切片的同时保留原有底层数组的容量,实现内存复用。
原理说明
Go的切片本质上是一个包含三个字段的结构体:
- 指向底层数组的指针
- 切片当前的有效长度(
len) - 切片的最大可容纳长度(
cap)
slice[low:high]是Go的切片截取语法,省略high时默认取原切片的len,省略low时默认取0。所以blankLines[0:0]的效果是:
- 新切片仍然指向原
blankLines的底层数组 - 新切片的
len被设置为0 - 新切片的
cap和原blankLines的cap完全一致
这段代码中的使用意图
你贴的代码里blankLines初始化时就指定了容量为128:
blankLines := make([]lineStat, 0, 128)
当执行到blankLines = blankLines[0:0]时,不会触发新的内存分配,只是把切片的有效长度重置为0,后续执行append操作时,会直接复用已经分配好的底层数组空间,只要追加的元素数量不超过128,就不会触发切片扩容,能有效减少内存分配开销,提升运行效率。
如果这里换成blankLines = []lineStat{}这类写法,会丢弃原有底层数组,触发GC回收,后续append时需要重新申请内存,性能会更低。
补充:Go中向切片头部追加元素的正确写法
如果要实现向切片头部追加元素,标准写法是:
// 向slice头部追加val slice = append([]T{val}, slice...)
和你看到的[0:0]语法没有关系。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

