主要講解Slice 的定義、設置、複製、刪除 操作
主要知識點
- Slice的定義與初始值
- 熟悉Slice append 之後 len 和 cap 的增長情況
- 手工指定 Slice 的 len 和 cap
- Slice 的 複製操作
- Slice 的刪除操作(從中間、最前端、最後端 刪除)
以下爲代碼示例:
package main
import "fmt"
//輸出Slice的各項值
func printSlice(s []int) {
fmt.Printf("val=%v, len=%d, cap=%d\n",
s, len(s), cap(s))
}
func sliceOps() {
fmt.Println("Creating slice")
var s []int // Slice 在沒賦值的情況下 值爲 nil
for i := 0; i < 10; i++ {
printSlice(s)
//val=[], len=0, cap=0
//val=[1], len=1, cap=1
//val=[1 3], len=2, cap=2
//val=[1 3 5], len=3, cap=4
//val=[1 3 5 7], len=4, cap=4
//val=[1 3 5 7 9], len=5, cap=8
//val=[1 3 5 7 9 11], len=6, cap=8
//val=[1 3 5 7 9 11 13], len=7, cap=8
//val=[1 3 5 7 9 11 13 15], len=8, cap=8
//val=[1 3 5 7 9 11 13 15 17], len=9, cap=16
// 此處可以看出 隨着不斷增加 Slice的 len 會隨着值的數量遞增
// 但是 所佔空間 一旦滿了之後,就會執行翻倍操作
s = append(s, 2*i+1)
}
fmt.Println(s) //[1 3 5 7 9 11 13 15 17 19]
s1 := []int{2, 4, 6, 8}
printSlice(s1) //val=[2 4 6 8], len=4, cap=4
//定義一個長度爲16的空Slice
s2 := make([]int, 16)
//定義一個長度爲16,佔用空間cap 爲32 的Slice
s3 := make([]int, 10, 32)
printSlice(s2) //val=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16
printSlice(s3) //val=[0 0 0 0 0 0 0 0 0 0], len=10, cap=32
fmt.Println("Copying slice")
copy(s2, s1) //將 s1 的值 複製 到 s2 中
printSlice(s2) //val=[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16
fmt.Println("刪除掉中間的元素")
s2 = append(s2[:3], s2[4:]...) //移除第三個元素
printSlice(s2) //val=[2 4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=15, cap=16
fmt.Println("移除第一個元素")
s2 = s2[1:]
printSlice(s2) //val=[4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=14, cap=15
fmt.Println("移除最後一個元素")
s2 = s2[:len(s2)-1]
printSlice(s2) //val=[4 6 0 0 0 0 0 0 0 0 0 0 0], len=13, cap=15
}
func main() {
sliceOps()
}