1. 程式人生 > >phper 的Goland學習之路--- 切片(陣列的檢視)

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