1、在golang中数组与切片的定义
在golang中,有一个“罕见”的复合类型,叫切片,切片是基于数组的,golang和其它语言不一样,在golang中,数组是不可变的,对数组进行类型转换等操作都会导致golang隐式的申请一块内存,然后将原数组的内容复制到这块内存。
在实际的开发当中,我们经常使用的是切片,而不是数组。
注意:数组是不可变的,这就决定了字符串也是不可变的,因为字符串底层就是一个byte数组实现的。
2、切片
切片是基于数组的,它表示一个拥有相同类型元素的可变长度的序列
切片是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素。即,可以把它看作一个指向数组的某块区域的引用,这块区域可以是数组的部分,也可以是数组的全部。
切片包含长度,容量,指针三个属性,指针指向的是数组的某块区域,容量一般是数组的长度,而长度指的是切片开始的位置到切片结束的位置的长度,而容量是指切片开始的位置到数组结束的位置。所以切片是依赖数组的。
举个例子:
数组: arr := [...]int{1,2,3,4,5}
切片:slice := arr[0:3] , 它所代表的意思就是数组arr中下标从0到2的内容(左闭右开)
3、注意事项:
(1)arr := [...]int{1,2,3,4,5} 与 arr := [ ]int{1,2,3,4,5}的区别??
如果加上省略号,表示可以不写数组长度,而是根据后面的初始化的序列来推断出数组长度,而省略了省略号,就表示声明一个切片
(2)在给函数传递参数时,是该传递数组,还是传递切片??
看具体的需求吧,但需要留意的是当传递数组的时候,相当于深拷贝,不会对原数组进行修改;而传递的是切片时,相当于c或者c++中传递数组首地址一样,会对其进行修改