切片的花式增刪

                                  時間平復了一時的衝動,卻加深了挫敗感。

                                                                                              ——馬爾克斯 《百年孤獨》

目錄

 

添加元素

刪除元素


添加元素

func main() {
	arr := []int{1}
	fmt.Println("原切片:", arr)
	// 尾部添加元素2, 3
	arr = append(arr, 2, 3)
	fmt.Println("尾部添加元素2、3:", arr) // [1 2 3]

	// 給尾部添加一個切片
	arr = append(arr, []int{4, 5}...) // 第二個參數非切片類型,因此切片需要解包
	fmt.Println("尾部添加切片{4,5}:", arr)  // [1 2 3 4 5]

	// 給切片開頭添加元素6
	arr = append([]int{6}, arr...)
	fmt.Println("開頭添加一個元素6:", arr) // [6 1 2 3 4 5]

	// 給切片開頭添加多個元素
	arr = append([]int{7, 8, 9}, arr...)
	fmt.Println("開頭添加元素7,8,9:", arr) // [7 8 9 6 1 2 3 4 5]

	// 給arr開頭添加元素-1,並且arr原來的4,5這兩個元素我不想要了(注意:前閉後開)
	arr = append([]int{-1}, arr[:7]...)
	fmt.Println("開頭添加一個元素-1,並且去掉4、5:", arr) // [-1 7 8 9 6 1 2 3]

	// 中間位置i插入方法1:多個append進行鏈式操作。需求:我需要在-1和7之間插入一個元素0
	arr = append(arr[:1], append([]int{0}, arr[1:]...)...) // 插入多個元素的話一樣,擴展0這個切片的元素就行了
	fmt.Println("在-1和7之間插入一個元素0:", arr)    // [-1 0 7 8 9 6 1 2 3],該方式append的第二個參數是裏層append創建的的臨時新切片

	// 中間位置i插入方法2:copy和append組合。需求:我需要在0和7之間(第三個位置,i=2)插入一個元素1
	arr = append(arr, 0) // 預留位置,擴展一個空間
	// 參數1:目標切片。參數2:原切片。即元素7挪到元素8的位置上,即元素8挪到元素9的位置上...整體右移一個位置,元素3會覆蓋上句添加的0
	copy(arr[3:], arr[2:]) // 不會創建臨時切片。copy(arr[i+1:],arr[i:])
	arr[2] = 1
	fmt.Println("在0和7之間插入一個元素1:", arr) // [-1 0 1 7 8 9 6 1 2 3]
}

控制檯

原切片: [1]
尾部添加元素2、3: [1 2 3]
尾部添加切片{4,5}: [1 2 3 4 5]
開頭添加一個元素6: [6 1 2 3 4 5]
開頭添加元素7,8,9: [7 8 9 6 1 2 3 4 5]
開頭添加一個元素-1,並且去掉4、5: [-1 7 8 9 6 1 2 3]
在-1和7之間插入一個元素0: [-1 0 7 8 9 6 1 2 3]
在0和7之間插入一個元素1: [-1 0 1 7 8 9 6 1 2 3]

Process finished with exit code 0

刪除元素

func main() {
	arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
	fmt.Println("原切片:", arr, "長度:", len(arr))

	// 刪除最後一個元素8,len=8,len-1
	arr = arr[:7]
	fmt.Println("刪除最後一個元素8:", arr) // [1 2 3 4 5 6 7]

	// 刪除最後兩個元素6、7,len=7,len-2
	arr = arr[:5]
	fmt.Println("刪除最後兩個元素6、7:", arr) // [1 2 3 4 5]

	// 刪除開頭第一個元素1
	arr = arr[1:]
	fmt.Println("刪除開頭第一個元素1:", arr) // [2 3 4 5]

	// 刪除開頭第一個元素2,使用append
	arr = append(arr[:0], arr[1:]...)
	fmt.Println("刪除開頭第一個元素2:", arr) // [3 4 5]

	// 刪除開頭第一個元素3,使用copy
	arr = arr[:copy(arr, arr[1:])]
	fmt.Println("刪除開頭第一個元素3:", arr) // [4 5]

	// 創建一個新切片
	arr2 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	fmt.Println("原切片arr2:", arr2, "長度:", len(arr2))

	// 刪除中間第i個元素,如刪除i=4的元素5
	arr2 = append(arr2[:4],arr2[5:]...)
	fmt.Println("刪除i=4位置上的元素5:", arr2) // [1 2 3 4 6 7 8 9]

	// 刪除中間第i個元素,如刪除i=2的元素3,使用copy。copy第一個參數是從i=2開始算的,因此最終結果時需要+2個長度
	arr2 = arr2[:copy(arr2[2:],arr2[3:])+2]
	fmt.Println("刪除i=2位置上的元素3:", arr2) // [1 2 4 6 7 8 9]

	// 刪除中間第i、i+1個元素,如刪除i=3、i=4的元素6、7,使用copy
	count := len(arr2)
	fmt.Println("刪除i=3、i=4位置上的元素6、7:", arr2[:count-copy(arr2[3:],arr2[5:])]) // [1 2 4 8 9]

}

控制檯

原切片: [1 2 3 4 5 6 7 8] 長度: 8
刪除最後一個元素8: [1 2 3 4 5 6 7]
刪除最後兩個元素6、7: [1 2 3 4 5]
刪除開頭第一個元素1: [2 3 4 5]
刪除開頭第一個元素2: [3 4 5]
刪除開頭第一個元素3: [4 5]
原切片arr2: [1 2 3 4 5 6 7 8 9] 長度: 9
刪除i=4位置上的元素5: [1 2 3 4 6 7 8 9]
刪除i=2位置上的元素3: [1 2 4 6 7 8 9]
刪除i=3、i=4位置上的元素6、7: [1 2 4 8 9]

Process finished with exit code 0

 

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