phper 的Goland学习之路--- 切片(数组的视图)
1、切片: 也就是底层数组的视图;经常用于传递参数,相当于数组的局部指针
切片的初始值是nil ; 如 var s [] int ; s是nil
切片定义:切片名 [ ] T T表示的切片元素类型 , 切片名 就是 指针地址 + 元素个数 + 容量个数
2、定义切片 :
(1)不初始化: var sliceName [ ] 数据类型 ; //和数组定义一样,去掉n
(2)定义的同时,初始化:
a 、使用数组初始化切片:
切片名 := 数组名 [ 开始下标 : 结束下标 ];
// 包含开始下标,不包含结束下标 [ : ] 代表获取数组中所有的元素 [2:] [ : 6]
b、类似数组定义,定义切片并初始化:
切片名 := [] int {1,2,2,4};
(3) 使用切片,获取切片中的值: s[ 新下标 ] // 修改 s[ 新下标 ] = 值 ;
3、切片作为形参:
func funcName( 形参名 [ ] 数据类型){ } // [ ] int 代表切片类型
使用: funcName( 数组名[ n : m ] );
如: arr := [...]int {0,1,2,3,4,5}; s1 := arr[ : 3] ; s2 := arr[ 3: ]; //s1 是 {0,1,2} ;s2是 {3,4,5}
s1[1] = 23; s2[2] = 34; //此时,arr 为 {0,23,2,3,4,34} ,s1 是 {0,23,2} ,s2是{3,4,34}
切片类似数组的局部引用,减少传值过程中造成的数据量较大的问题;只需要传递局部的值即可;就是传递切片(类似引用)。
切片Slice
其本身并不是数组,它指向底层的数组
作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型
可以直接创建或从底层数组获取生成
使用len()获取元素个数,cap()获取容量
一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部
make([]T, len, cap)
其中cap可以省略,则和len的值相同
len表示存数的元素个数,cap表示容量
注意:
len(切片) cap(切片)
Reslice(再次切片)
Reslice时索引以被slice的切片为准
(arr := [...]int {0,1,2,3,4,5};
s1 := arr[ 2 : ] ; s2 := S1[ 0 : 3]; )
索引越界不会导致底层数组的重新分配而是引发错误
Append(添加)
可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终长度未超过追加到slice的容量则返回slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
Copy
4、往切片中添加数据:
使用append(切片,值) ,添加元素到切片中
(1)如果添加值的时候,切片的实际长度大于原先的len,并小于cap,则添加值到不可见域中
(2)如果添加值的时候,切片的实际长度大于cap,则创建一个新的数组,并拷贝原先数组中的值,到新数组中;如果原先的数组不再被使用,则被go的垃圾回收机制回收;否则不回收。并返回新的slice切片,len和cap都动态变化。类似变长数组。
6、拷贝切片: copy(s1,s2);
7、删除切片:
s2 := []int{2,4,6,8,9,10,12,23}; // 删除8
s2 = append(s2[:3] ,s2[4:] ... ); // 可以删除掉8