golang中的切片

前言

golang里面有个数据类型叫切片,这在java里面是没有对应的数据结构,发现还挺有意思的,也有一些要注意的点,特此记录一下。

首先,切片在golang中是属于引用数据类型,其结构相当于一个可变数组,其中有容量和长度的概念,长度则是我们所理解的储存数据的大小,而容量则是该数组所能容纳的最大数据量。

那么有人可能会说,不是说是可变数组吗?怎么还会有容量的限制?

记录

首先我们要知道,在golang|中,给切片追加数据使用的是append函数,当我们使用make函数创建一个切片时,实际上底层为我们引用了一个底层数组,这个底层数组的容量即为切片的容量。当我们在容量足够时,数据可以正常往这个底层数组添加,但是当容量不足够了,此时从程序上看,他是不会报错的,也就是我们所说的这个数组“扩容”了。但是实际上,从底层来看,我们知道数组是不能扩容的,所以golang就将原来的引用指向了容量更大的底层数组,以此来达到扩容的目的。下面的例子可以看下:

func main()  {
    
    
	var slice []int = make([]int,5,8)
	slice[1] = 20
	slice[3] = 10
	fmt.Printf("slice=%p\n",slice)
	slice1 := append(slice, 70,80,90)
	fmt.Printf("slice1=%v slice1=%p\n",slice1,slice1)
	slice2 := append(slice, 70,90,70)
	fmt.Printf("slice2=%v slice2=%p\n ",slice2,slice2)
}

在这里插入图片描述

还有一个点,我们知道golang可以用rang来遍历,但是当我们遍历切片时,遍历的次数是按长度还是容量呢?
答案是长度。我们可以通过测试以下代码配合底层源码来理解。

func main()  {
    
    
	var slice []int = make([]int,5,8)
	for range slice {
    
    
		fmt.Println("test......",slice)
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43896829/article/details/121003726