Slice切片
slice是这样的结构:先创建一个有特定长度和数据类型的底层数组,然后从这个底层数组中选取一部分元素,返回这些元素组成的集合(或容器),并将slice指向集合中的第一个元素。换句话说,slice自身维护了一个指针属性,指向它底层数组中的某些元素的集合。
声明和初始化
声明:
var a []int
初始化:
a := new([]int)
fmt.Println(*a)
b := make([]int, 0, 5)
fmt.Println(b)
当声明一个slice,但不做初始化的时候,这个slice就是一个nil slice,这个slice不会指向哪个底层数组。初始化后的slice有指向的底层数组,只不过指向的底层数组暂时是长度为0的空数组。
make()比new()函数多一些操作,new()函数只会进行内存分配并做默认的赋0初始化,而make()可以先为底层数组分配好内存,然后从这个底层数组中再额外生成一个slice并初始化。另外,make只能构建slice、map和channel这3种结构的数据对象,因为它们都指向底层数据结构,都需要先为底层数据结构分配好内存并初始化。
初始化时直接赋初值:
// 创建长度和容量都为4的slice,并初始化赋值
color_slice := []string{
"red","blue","black","green"}
// 创建长度和容量为100的slice,并为第100个元素赋值为3
slice := []int{
99:3}
slice能被访问的元素只有length范围内的元素,那些在length之外,但在capacity之内的元素暂时还不属于slice,只有在slice被扩展时(见下文append),capacity中的元素才被纳入length,才能被访问。
可以通过len()函数获取slice的长度,通过cap()函数获取slice的Capacity。
my_slice := make([]int,3,5)
fmt.Println(len(my_slice)) // 3
fmt.Println(cap(my_slice)) // 5
对slice切片
可以从slice中继续切片生成一个新的slice,这样能实现slice的缩减。
对slice切片的语法为:
SLICE[A:B]
SLICE[A:B:C]
其中A表示从SLICE的第几个元素开始切,B控制切片的长度(B-A),C控制切片的容量(C-A),如果没有给定C,则表示切到底层数组的最尾部。
还有几种简化形式:
SLICE[A:] // 从A切到最尾部
SLICE[:B] // 从最开头切到B(不包含B)
SLICE[