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)
}