Go語言中分片(Slice)的其他使用方式 原

主要講解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()
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章