go语言切片的扩容机制,append()函数
go语言的切片被称为“动态数组”,也就是说起长度和容量是可以进行扩展的,其机制如下:
go语言切片的扩容机制
- 当切片的长度len小于切片的容量cap时,向切片追加元素,切片的容量不会扩展;
- 当切片的长度len等于切片的容量cap时,向切片追加元素,切片的容量会成倍扩展,即变成2cap;
- 切片容量扩展的同时,计算机为切片分配了新的内存空间(内存地址可以不变),并将原来内存空间上的存储(切片元素)复制到当前内存空间当中,这都需要消耗一定的性能;
切片扩容机制实例
package main
import (
"fmt"
)
func main() {
s := []int{0, 1, 2}
fmt.Printf("s的长度为%d,容量为%d,内存地址为%p \n", len(s), cap(s), &s)
s = append(s, 3)
fmt.Printf("s的长度为%d,容量为%d,内存地址为%p \n", len(s), cap(s), &s)
}
代码输出:
s的长度为3,容量为3,内存地址为0xc000xxc060
s的长度为4,容量为6,内存地址为0xc000xxc060
代码解析
如上代码,&s中&是寻址符号,用于返回变量的内存地址。从上面的输出,可知切片一旦扩容,容量是成倍增加的,计算机因此需要分配新的内存空间,并将原空间中的存储copy到新的空间,不过内存地址没有发生改变。
所以,通常情况下,在确定切片slice的容量或长度大小的前提条件下,最好设置好slice的容量大小,避免一而再再而三地扩容,从而导致程序的性能降低。
append()函数
append( slice, element )函数可用于向切片追加元素,实例如上,更多的用法可以参考下一章节的内容。注意:数组array没有append()方法。