go 语言切片slice

概念

Slice代表边长的序列,序列中的每个元素的类型都想同。可以通过对切片再次切片来缩小一个切片的大小,因为切片的底层内存也是在连续块中分配,所以切片还能获得索引,迭代以及为垃圾回收优化的好处。

切片的创建make

//创建一个字符串切片
//其长度和容量都为5
slice := make([]string,5)

//创建一个整数切片
//其长度为3容量为5
slice := make([]int,3,5)

//初始化切片的第100个元素
slcie := []string{99:""}

切片和数组的声明是不同的

//创建有3个元素的整型数组
array := [3]int{10,20,30}

//创建长度和容量都为3的整型切片
slice := []int{10,20,30}

修改切片

// 创建一个整型切片
// 其长度和容量都是 5 个元素
slice := []int{10, 20, 30, 40, 50}
// 创建一个新切片
// 其长度是 2 个元素,容量是 4 个元素
newSlice := slice[1:3]
// 修改 newSlice 索引为 1 的元素
// 同时也修改了原来的 slice 的索引为 2 的元素
newSlice[1] = 35

go 语言切片slice

使用append向切片增加元素

//创建切片
slice := []int{1,2,3,4,5}
//创建一个新的切片
//长度为2容量为4
newSlice := slice[1:3]
//使用切片的原有的容量来分配一个新的元素
//将新的元素赋值60
newSlice := append(newSlice,60)	

go 语言切片slice
因为 newSlice 在底层数组里还有额外的容量可用, append 操作将可用的元素合并到切片的长度,并对其进行赋值。由于和原始的 slice 共享同一个底层数组, slice 中索引为 3 的元素的值也被改动了。
如果切片的底层数组没有足够的可用容量, append 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里,再追加新的值.如下:

使用 append 同时增加切片的长度和容量


// 创建一个整型切片
// 其长度和容量都是 4 个元素
slice := []int{10, 20, 30, 40}// 向切片追加一个新元素
// 将新元素赋值为 50
newSlice := append(slice, 50)

当这个append操作完成后,newslice拥有一个全新的底层数组,这个数组容量是原来的两倍。
go 语言切片slice

函数 append 会智能地处理底层数组的容量增长。在切片的容量小于 1000 个元素时,总是
会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25%
的容量。随着语言的演化,这种增长算法可能会有所改变。

切片的遍历

for index,value := range slice{
	fmt.Printf("Index: %d Value: %d\n",index , value)
}