Go基础学习——切片

一、切片声明

package main

import "fmt"

func main() {
	var slice_1 []int  // nil切片
	fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_1), cap(slice_1), slice_1) // len=0, cap=0, slice=[]

	slice_2 := []int{}  // 空切片
	fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_2), cap(slice_2), slice_2) // len=0, cap=0, slice=[]

	slice_3 := []int{1, 2, 3, 4, 5}
	fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_3), cap(slice_3), slice_3) // len=5, cap=5, slice=[1 2 3 4 5]

	slice_4 := make([]int, 5, 9)
	fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_4), cap(slice_4), slice_4) // len=5, cap=9, slice=[0 0 0 0 0]

	slice_5 := make([]int, 5, 9)
	fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_5), cap(slice_5), slice_5)
}

二、切片截取

package main

import "fmt"

func main() {

   // slice[start:end:maxCap]
   // start: 切片起始下标(包含),可以省略,默认是0
   // end: 切片截止下标(不包含),可以省略,默认是源切片的长度
   // maxCap: 新的切片最大容量

   slice_1 := []int{1, 2, 3, 4, 5}
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_1), cap(slice_1), slice_1) // len=5, cap=5, slice=[1 2 3 4 5]

   slice_2 := slice_1[1:]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_2), cap(slice_2), slice_2) // len=4, cap=4, slice=[2 3 4 5]

   slice_3 := slice_1[1:3]
   // len=2, cap=4, slice=[2 3]
   // 为什么容量是4?
   // 由于 slice_3 是从 slice_1 的第 1 个元素开始切片的,因此其容量从该位置开始计算,一直到 slice_1 的末尾。slice_1 的末尾位置为 5,因此 slice_3 的容量为 5 - 1 = 4。
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_3), cap(slice_3), slice_3)

   slice_5 := slice_1[0:4:5]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_5), cap(slice_5), slice_5) //len=4, cap=5, slice=[1 2 3 4]
}

三、切片追加

package main

import "fmt"

func main() {

   // 当slice容量无法添加新的元素时,slice会执行扩容
   // slice扩容时会重新分配一个更大的底层数组,将原来的数组元素复制到新的数组中
   // slice扩容时新的数组容量是旧数组容量 * 2

   slice_1 := []int{1, 2}
   // len=5, cap=5, slice=[1 2]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_1), cap(slice_1), slice_1)

   slice_2 := append(slice_1, 3)
   // len=3, cap=4, slice=[1 2 3]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_2), cap(slice_2), slice_2)

   slice_3 := append(slice_2, 4)
   // len=4, cap=4, slice=[1 2 3 4]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_3), cap(slice_3), slice_3)

   slice_4 := append(slice_3, 5)
   // len=5, cap=8, slice=[1 2 3 4 5]
   fmt.Printf("len=%d, cap=%d, slice=%v\n", len(slice_4), cap(slice_4), slice_4)
}