1. 简介
切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(本身就是一个指针,不能用指针指向 slice)。
这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。
切片的类型为 [] T,与数组的区别为切片类型不包含 长度;
使用切片时,切片下标不能超过切片长度的范围(0<= index <len)
2. 创建切片
创建切片可以基于现有数组创建,也可以通过 make 函数创建
// make 函数创建切片 // 指定切片长度和容量 var slice = make([]int,5) // 输出:slice type=[]int, len=5, cap=5,value=[0 0 0 0 0] fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v ",slice,len(slice),cap(slice), slice) // 指定切片长度,容量未指定时默认等于长度 slice = make([]int,3,5) // 输出:slice type=[]int, len=3, cap=5,value=[0 0 0] fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v ",slice,len(slice),cap(slice), slice) // 基于数组生成切片 var array = [5]int {1,2,3,4,5} // 输出:array type=[5]int,len=5, cap=5,value=[1 2 3 4 5] fmt.Printf("array type=%T,len=%d, cap=%d,value=%v ",array,len(array),cap(array), array) // 前闭后开 var slice2 = array[2:3] // 输出:slice2 type=[]int,len=1, cap=3,value=[3] fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v ",slice2,len(slice2),cap(slice2), slice2)
3 修改切片
3.1 修改切片区间
切片修改时不能超过切片的容量,超过容量时就需要创建一个更大的切片;
// 相当于引用的区间为 0:3,前闭后开 slice = make([]int,3,5) for i := 0; i < len(slice); i++ { slice[i] = i } // 省略起始位置时,默认为原来的起始位置 slice2 = slice[:4] // 输出:slice2 type=[]int,len=4, cap=5,value=[0 1 2 0] fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v ",slice2,len(slice2),cap(slice2), slice2) // 省略结束位置时,默认为原来的结束位置 slice2 = slice[1:] // 输出:slice2 type=[]int,len=2, cap=4,value=[1 2] fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v ",slice2,len(slice2),cap(slice2), slice2) // 重新定义起始区间位置 slice2 = slice[0:5] // 输出:slice2 type=[]int,len=5, cap=5,value=[0 1 2 0 0] fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v ",slice2,len(slice2),cap(slice2), slice2)
3.2 追加元素
内置 append 函数向切片中追加元素,类似于Java的List,超出容量后,可以动态扩容
var slice = make([]int,3,5) slice = append(slice, 1, 2, 3) // slice type=[]int, len=6, cap=10,value=[0 0 0 1 2 3] fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v ",slice,len(slice),cap(slice), slice)
3.3 复制切片
内置 copy 函数可以将一个切片的蒜素复制到另一个切片;
copy(dst,src),返回复制的元素个数
dst:目的切片,src:源切片
var array = [3]int{1,2,3} var slice = array[0:3] fmt.Println(slice) var slice2 = make([]int,6,6) num := copy(slice2, slice) fmt.Println(num) fmt.Println(slice2)
输出结果:
4. 基本应用
4.1 字符串生成切片
str:="golang" bytes:=[]byte(str) // 打印 bytes 的类型和值 fmt.Printf("bytes: type=%T,value=%v ",bytes,bytes) // 以字符形式打印每个元素 for _, value := range bytes { fmt.Printf("%c ",value) }
输出结果: