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()方法。



全栈后端 / go语法 :













Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.