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]; )

    索引不可以超过被slice的切片的容量cap()值
    索引越界不会导致底层数组的重新分配而是引发错误

Append(添加)
可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终长度未超过追加到slice的容量则返回slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据


Copy 

4、往切片中添加数据: 

               使用append(切片,值)  ,添加元素到切片中

(1)如果添加值的时候,切片的实际长度大于原先的len,并小于cap,则添加值到不可见域中


(2)如果添加值的时候,切片的实际长度大于cap,则创建一个新的数组,并拷贝原先数组中的值,到新数组中;如果原先的数组不再被使用,则被go的垃圾回收机制回收;否则不回收。并返回新的slice切片,len和cap都动态变化。类似变长数组。

5、创建slice(常用):    
             make( [ ] 数据类型, 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 


点击打开链接 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值