# GO types Slice
### Author 品茶
> Slice(切片)代表变长的序列,序列中每个元素都具有相同的类型,slice类型写成[]T,T代表slice中元素的类型,slice的语法和数组很像
> 只是没有固定长度而已。
> slice的底层引用一个数组对象,三部分组成:指针、长度(len)、容量(cap),指针指向第一个slice元素对应的底层数组元素的地址,
> 注意slice的第一个元素并不一定就是数组的第一个元素(有可能是切片后的)。
> 长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
> 长度:实际元素个数
> 容量:最大可装载的元素个数,超过则对前一个容量*2
多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠
~~~
func main() {
// 定义一个数组
months := [...]string{
1: "January",
2: "February",
3: "March",
4: "Aprill",
5: "May",
6: "June",
7: "july",
8: "August",
9: "September",
10: "October",
11: "November",
12: "December",
}
// 定义一个slice是不需要指定长度的,指定了就是数组
//s := []int{0,1,2,3,4} // 这是slice定义
//s1 := [...]int{0,1,2,3,4} // 数组定义
//s2 := [3]int{1,2,3} // 数组定义
// 切片操作 s[i:j] 0 <= i <= j <= cap(s)
Q1 := months[1:4]
Q2 := months[4:7]
Q3 := months[7:10]
Q4 := months[10:]
Summmer := months[6:9]
fmt.Println(Q2, Q4)
fmt.Println(Q1, Q3)
fmt.Println(Summmer[:20])
// slice不支持直接比较,还是一样需要调用bytes.Equal来进行比较。因为是对底层类型的间接引用(浅拷贝),还是指针值的修改。所以不方便比较
// append 向slice追加元素 注意重新分配内存和copy操作 cap = cap * 2
}
~~~