package main

import (
	"fmt"
)

// Slice（切片）代表变长的序列，序列中每个元素都有相同的类型。、
// 一个slice类型一般写作[]T，其中T代表slice中元素的类型；
// slice的语法和数组很像，只是没有固定长度而已。

// 数组和slice之间有着紧密的联系。
// 一个slice是一个轻量级的数据结构，
// 提供了访问数组子序列（或者全部）元素的功能，
// 而且slice的底层确实引用一个数组对象。
// 一个slice由三个部分构成：指针、长度和容量。
// 指针指向第一个slice元素对应的底层数组元素的地址，
// 要注意的是slice的第一个元素并不一定就是数组的第一个元素。
// 长度对应slice中元素的数目；长度不能超过容量，
// 容量一般是从slice的开始位置到底层数据的结尾位置。
// 内置的len和cap函数分别返回slice的长度和容量。

// 多个slice之间可以共享底层的数据，并且引用的数组部分区间可能重叠。

// 切片可以对自己进行切片操作生成新的切片

func main() {
	month := [...]string{
		1:  "January",
		2:  "February",
		3:  "March",
		4:  "April",
		5:  "May",
		6:  "June",
		7:  "July",
		8:  "August",
		9:  "September",
		10: "October",
		11: "November",
		12: "December",
	}
	summer := month[6:9]
	fmt.Println(summer)
	q2 := month[4:7]
	fmt.Println(q2)

	// 可以用append向切片末尾添加一个元素 或者 另一个切片

	var x []int
	x = append(x, 1, 2, 3)
	fmt.Println(x)
	x = append(x, x[1:]...) // 其中在append函数参数中的最后的“...”省略号表示接收变长的参数为slice
	fmt.Println(x)

}
