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都動態變化。類似變長陣列。
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