Golang-数组和切片的区别

在Golang中,数组和切片是两种不同的数据类型,它们在使用方式和特性上有一些区别。

1.基本概念

数组是一组固定长度的元素序列,它的长度是在定义时就确定了,而且数组的每个元素的类型必须相同。

数组的声明方式为:var 数组名 [元素个数] 元素类型。

例如:定义一个包含5个整数的数组:

var arr [5]int

切片是一个动态数组,它可以根据需要动态增加或缩减长度,而且切片的元素类型可以是任意类型。

切片的声明方式为:var  切片名 [ ]  元素类型。

例如:定义一个包含5个整数的切片:

var sli []int = []int{1, 2, 3, 4, 5}

因此,切片的长度是在运行时动态确定的。可以使用append()函数向切片中追加元素或使用copy()函数复制切片中的元素。

2.内存布局

        数组是一段连续的内存空间,它的长度是固定的,而且所有元素都会被分配空间。切片是一个结构体,它包含了一个指向底层数组的指针、长度和容量等属性。切片的长度可以动态增加或缩减,而底层数组的长度不会改变。

3.函数参数传递和返回值

        数组是值传递,即传递的是数组的副本,而切片是引用传递,即传递的是指向底层数组的指针。这意味着对于大型数组来说,将其传递给函数会导致内存开销较大,而对于切片来说,传递指向底层数组的指针只需要开销很小的内存空间。


另:切片中cap()的注意事项

在 Golang 中,切片的容量(capacity)是在创建切片时预分配的底层数组的长度,即在不扩展底层数组的情况下,切片可以存储的最大元素数量。如果在使用切片时向其添加元素,当容量超过预设的 cap 值时,Golang 会自动扩展底层数组的大小,以容纳更多的元素。具体的扩容方式如下:

  1. 如果添加元素后的长度(即切片中存储的元素数量)小于等于当前容量的两倍,则会扩容为当前容量的两倍。
  2. 如果添加元素后的长度大于当前容量的两倍,则会按照添加元素后的长度直接进行扩容。

当底层数组扩容时,Golang 会重新分配一个新的底层数组,并将原有的元素复制到新的底层数组中。这个过程会带来一些额外的开销,因此在创建切片时预估合适的容量是很重要的。如果能够预估准确,可以避免过多的扩容操作,提高程序的效率。

你可能感兴趣的:(golang,算法,golang)