切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。
Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“那一块”,切的过程包含从哪里开始(切片的起始位置)及切多大(切片的大小),容量可以理解为装切片的口袋大小,如下图所示。
从数组或切片生成新的切片
切片默认指向一段连续内存区域,可以是数组,也可以是切片本身。
从连续内存区域生成切片是常见的操作,格式如下:
slice [开始位置 : 结束位置]
语法说明如下:
- slice:表示目标切片对象;
- 开始位置:对应目标切片对象的索引;
- 结束位置:对应目标切片的结束索引。
从数组或切片生成新的切片拥有如下特性:
- 取出的元素数量为:结束位置 - 开始位置;
- 取出元素不包含结束位置对应的索引,切片最后一个元素使用 slice[len(slice)] 获取;
- 当缺省开始位置时,表示从连续区域开头到结束位置;
- 当缺省结束位置时,表示从开始位置到整个连续区域末尾;
- 两者同时缺省时,与切片本身等效;
- 两者同时为 0 时,等效于空切片,一般用于切片复位。
程序实例代码
package main
import "fmt"
func main() {
fmt.Println("从数组或切片生成新的切片")
//a 是一个拥有 3 个整型元素的数组,被初始化为数值 1 到 3
var a = [3]int{1, 2, 3}
//使用 a[1:2] 可以生成一个新的切片 [2] 就是 a[1:2] 切片操作的结果
fmt.Println(a, a[1:2])
fmt.Println("表示原有的切片")
//生成切片的格式中,当开始和结束位置都被忽略时,生成的切片将表示和原切片一致的切片
fmt.Println(a[:])
fmt.Println("重置切片,清空拥有的元素")
fmt.Println(a[0:0])
fmt.Println("直接声明新的切片")
//声明字符串切片
var strList []string
//声明整型切片
var numList []int
//声明空整型切片
var numListEmpty = []int{}
//输出3个切片
fmt.Println(strList, numList, numListEmpty)
//输出3个切片大小
fmt.Println(len(strList), len(numList), len(numListEmpty))
fmt.Println("使用 make() 函数构造切片")
c := make([]int, 2)
d := make([]int, 2, 10)
fmt.Println(c, d)
fmt.Println(len(c), len(d))
}
输出结果