hic003cih / Golang

0 stars 0 forks source link

Slice 切片 #27

Open hic003cih opened 4 years ago

hic003cih commented 4 years ago

Array(數組) 的大小是固定的,而切片為Array提供動態的大小

类型 []T 表示一个元素类型为 T 的切片。

切片通过两个下标来界定,即一个上界和一个下界,二者以冒号分隔: a[low : high] 它会选择一个半开区间,包括第一个元素,但排除最后一个元素。

以下表达式创建了一个切片,它包含 a 中下标从 1 到 3 的元素:

a[1:4]

package main

import "fmt"

func main() {
    primes := [6]int{2, 3, 5, 7, 11, 13}

    var s []int = primes[1:4]
    fmt.Println(s)
}
hic003cih commented 4 years ago

slice並不儲存和複製任何值到定義的slice變數中 所以如果你修改了slice變數內的array的值 會連動修改到原始的array

package main

import "fmt"

func main() {
    names := [4]string{
        "John",
        "Paul",
        "George",
        "Ringo",
    }
    fmt.Println(names)

    a := names[0:2]
    b := names[1:3]
    fmt.Println(a, b)

    b[0] = "XXX"
    fmt.Println(a, b)
    fmt.Println(names)
}

image

hic003cih commented 4 years ago

append 方法 在slice後面加上數字 append(s,i) 在s後面加上i

make 方法 make([]int,10,32) int -> 要建立的類型 10 -> 長度(length) 32 -> 容量(capacity)

hic003cih commented 4 years ago

Copy slice

fmt.Println("Copying slice:")
    copy(s2, s1)
    printSlice(s2)
copy方法
copy(s2, s1)
將 s1 的值,複製到 s2 的 函數去
ex: s1 -> [2,4,6,8]
s2 -> [0,0,0,0]
執行copy後
s2 -> [2,4,6,8,0,0,0,0]
hic003cih commented 4 years ago

刪除 element

fmt.Println("Deleting elements from slice:")
    s2 = append(s2[:3], s2[4:]...)
    printSlice(s2)
如果要刪除sliece中的一個元素
使用 append 方法將元素去掉,再合併
我要將s2 的 第4個element[8] 去除 
s2 = append(s2[:3], s2[4:]...)
s2[:3] -> 取前3個element -> [2,4,6]
s2[4:] -> 取後5個以後的element -> [0,0,0,0]
再將兩個slice合併
append(s2[:3], s2[4:]...) -> 合併以後 -> [2,4,6,0,0,0]
就可以了
hic003cih commented 4 years ago

取出頭尾的值

fmt.Println("Popping from front:")
front := s2[0]
s2 = s2[1:]
fmt.Println(front)
printSlice(s2)

將第一個element popp(取出) 第一個element 就是 s2[0] 然後用slice 方法 ,從 1 開始取後面的值 [4,6,0,0,0]

fmt.Println("Popping from back:")
tail := s2[len(s2) - 1]
s2 = s2[:len(s2) -1]
fmt.Println(tail)
printSlice(s2)

將最後一個element popp(取出) 最後一個element 就是 s2[長度- 1] 然後用slice 方法 ,取到後面的最後一個 s2 的 len(s2) 是 5 , 所以要用 s2[:4] s2[:4] -> [4,6,0,0] [4,6,0,0,0]

hic003cih commented 4 years ago

slice 方法 s2[x:] -> 取x值(index)以後的element

b :=[0,1,2,3,4] ex: e :=b[3:] e -> [3,4] len:2 cap:2

s[:x] -> 取 x (index)以前的element

b :=[0,1,2,3,4] ex c :=b[:2] c -> [0,1] len:2 cap:5