//go_sliceproject /*
1.array和slice的區別:
a.array是有長度的,而slice是沒有長度的
b.array 是值類型,而slice是引用類型
2. slice 的創建方法:
var arr = [...]int{1,2,3,4,5,6}
a. 基於array的創建
slice1 := arr[0:6]
slice1 = arr[:6]
slice1 = arr[0:]
slice1 = arr[:]
b. 基於slice 的創建
slice2 := slice1[0:3] // 基於slice創建不能超過 slice1的cap,否則會出錯。
c. 直接創建
slice3 := make([]int,5,10) // cap = 10 len = 5
slice4 := []int{1,2,3,4,5,6,7,8,50:100} // 直接初始化創建賦值,len= 50+1 ,最後一個數組元素的值是100.
d. new 進行創建
sliceA := new([]int)
(*sliceA) = append((*sliceA), 1, 2, 3, 4)
3. slice 增加 、修改 、遍歷、拷貝
var arr = [...]int{0,1,2,3,4,5,6}
a.slice的增加:
slice1 = arr[:]
slice1 = append(slice1 ,1,2,3)
slice2 = slice1[2:6]
slice1 = append(slice1 ,slice2...)
tips: 在slice的增加過程中,如果len>cap的話,系統會自動重新分配一個更大的slice用來儲存。
b.slice的修改:
slice可以直接進行修改值,操作方法和數組一樣
slice1[2] = 100
c.slice的遍歷
for i := 0; i < len(slice7); i++ {
fmt.Println("first way : ", i, " = ", slice7[i])
}
for i, v := range slice7 {
fmt.Println("second way : ", i, " = ", v)
}
d.slice的拷貝
copy(slice1,slice2) // 將slice2拷貝到slice1中,
if len(slice2) > len(slice1) -> 只是從slice2中拷貝 len(slice1)個數值
相反同理。
4.slice 的原理:
slice 可以看成 底層數組 + cap(容量) + 數組偏移(數組指針)
其實質就是利用數組指針進行操作底層數組,cap是整個底層數組的len ,而 數組偏移在很多的書中表示爲 slice 的 len ,可以看成是 在 cap 這個容量上,指針偏移的長度。
類似於 C++ stl 中的vector 。
在多個slice基於一個數組創建的情況下,如果一個slice對數組值進行了修改,那麼所以的slice和array相應
位置的值都會變化,原因是因爲,他們操作的屬於同一個底層數組,下面代碼說明一下
var arr = [...]int{1,2,3,4}
slice1 := arr[1:4] // 2,3,4
slice2 := slice1[1:3] // 3,4
slice2[0] = 100
輸出結果:arr: [1 2 100 4]
slice1: [2 100 4]
slice2: [100 4]
在這裏 arr 就相當於 slice1 和slice2 的底層數組 ,而slice 只是在底層數組上做的指針的偏移。
*/
package main
import (
"fmt"
)
func main() {
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice1 []int = arr[0:6] //0 1 2 3 4 5 6
slice2 := slice1[2:7]
slice3 := make([]int, 5, 10)
slice3[4] = 10
slice3 = append(slice3, 11)
slice4 := []int{0, 1, 2, 3, 4, 15: 1}
fmt.Println("slice1's cap = ", cap(slice1), "slice1's len = ", len(slice1), "\r\n", slice1)
fmt.Println("slice2's cap = ", cap(slice2), "slice2's len = ", len(slice2), "\r\n", slice2)
fmt.Println("slice3's cap = ", cap(slice3), "slice3's len = ", len(slice3), "\r\n", slice3)
fmt.Println("slice4's cap = ", cap(slice4), "slice4's len = ", len(slice4), "\r\n", slice4)
slice5 := arr[:]
slice5 = append(slice5, 11, 22, 33, 44, 55, 66)
fmt.Println(slice5)
slice6 := slice5[4:8]
slice5 = append(slice5, slice6...)
fmt.Println(slice5)
slice7 := arr[:]
slice7[2] = 100
fmt.Println("slice1[2]=", slice1[2])
fmt.Println("slice7[2]=", slice7[2])
fmt.Println("array[2]=", arr[2])
for i := 0; i < len(slice7); i++ {
fmt.Println("first way : ", i, " = ", slice7[i])
}
for i, v := range slice7 {
fmt.Println("second way : ", i, " = ", v)
}
copy(slice5, slice6)
fmt.Println(slice5)
copy(slice6, slice5)
fmt.Println(slice6)
var array = [...]int{1, 2, 3, 4}
slice8 := array[1:4] // 2,3,4
slice9 := slice8[1:3] // 3,4
fmt.Println(array, slice8, slice9)
slice9[0] = 100
fmt.Println(array, slice8, slice9)
}