在golang中有数组和Slice两种数据结构,Slice是基于数组的实现,是长度动态不固定的数据结构,本质上是一个对数组字序列的引用,提供了对数组的轻量级访问。那么我们今天就给大家详细介绍下Golang中的Slice与数组,

1.Golang中的数组

    数组是一种具有固定长度的基本数据结构,在golang中与C语言一样数组一旦创建了它的长度就不允许改变,数组的空余位置用0填补,不允许数组越界。

     数组的一些基本操作:

     1.创建数组:

  2.数组是值拷贝传递:

2.Golang中的切片(slice) 

     1.首先看看slice的源码结构:

  slice是一个特殊的引用类型,但是它自身也是个结构体

       属性len表示可用元素数量,读写操作不能超过这个限制,不然就会panic

       属性cap表示最大扩张容量,当然这个扩张容量也不是无限的扩张,它是受到了底层数组array的长度限制,超出了底层array的长度就会panic

     2.slice的创建:

 上面代码中创建了一个长度为7的数组arr,同时创建一个基于数组arr的切片slice1,切片引用了数组的index=1到index=3之间的元素,同时也允许切片最大扩张1个元素大小的空间。如果这个扩张空间大于7那么程序就会panic。最后创建了一个基于slice1延申的一个切片slice2,它引用了切片的index=1到index=3之间的元素,由于slice1最大扩容1个元素,因此slice2也最多扩容一个元素,超过了会panic。

    创建基于底层数组的slice,其cap取值在: len<=cap<=len(arr)之间

    创建基于一个切片的slice,其cap取值在: len(slice1)<=cap<=cap(slice1)之间

   3.slice使用make创建

   4.切片作为参数传递

  因为切片是个引用类型,所以它作为参数传递给函数,函数操作的实质是底层数组

3.Golang中的切片追加append()

  这里由于slice进行追加的元素超出了原来数组的大小,因此go内部会帮我们创建一个新的底层数组,而slice的引用地址不再是arr了,变成了新创建的数组。

       还有一种情况就是当slice进行追加的时候没有超出原来数组的大小的时候,其引用地址没有发生改变。

4.总结

Golang中的Slice与数组及区别详解 - 编程语言

    (1)go是有数组的,只是平时用切片比较多。数组大小一旦创建就不能改变,数组长度大于元素个数的时候会用0补位,这跟其他语言是相通的。

     (2)切片slice可以看作是对数组的一切操作,它是一个引用数据类型,其数据结构包括底层数组的地址,以及元素可操作长度len或可扩容长度cap。

     (3)要想突破slice的扩容cap限制进行无限扩容就需要使用append()函数进行操作。如果append追加的元素后slice的总长度不超过底层数组的总长度,那么slice引用的地址不会发生改变,反之引用地址会           变成新的数组的地址。

     (4)slice是一个抽象的概念,它存在的意义在于方便对一个顺序结构进行一些方便操作,例如查找,排序,追加等等,这个类似于python的list。

下面看下golang 数组和slice 的区别

golang 数组和切片的区别

数组: 长度不可变,初始化的时候声明长度

slice 长度可变

var a [32] int
var b [3][5] int

a和b的类型不一样

slice 创建的时候可以不指定长度。

总结