Go基礎 - slice

//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)
}

 
發佈了28 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章