一、前言
Go语言中有数组与切片的概念,两者最简单的区别就是,数组在声明的时候需要指定数组大小,数组类型和操作不够灵活,而切片不需要,因此Go中常用的就是切片,本文主要讲解切片。
注:参数传递时:数组属于值传递,切片属于引用传递。
二、切片(slice)
切片就是一种简化版的动态数组。下面是切片的结构定义,reflect.SliceHeader:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
- Data 是指向数组的指针
- Len 是当前切片的长度
- Cap 是当前切片的容量,即Data数组的大小
举例(slice切片 sliceSub子切片):slice := [] int{2,3,5,7,11} 和 sliceSub :=slice[1:3]
sliceSub := slice[low:high:max] 切片的三个参数含义:
low <= high <= max
- low:截取的起始下标 (包含)
- high:截取的结束下表(不包含)
- max:默认为slice的容量
sliceSub中对应的len = high - low ; cap = max - low。
三、切片的操作
切片支持append操作,向切片中最后位置追加元素 ,在append的时候cap扩容规律:
- cap < 1024时,每次扩容2 * cap;
- cap > 1024时,每次扩容1.25 * cap;
切片的cap小于1024时,如下图:
切片的cap大于1024时,如下图: 1280 = 1024 * 1.25