go学习之切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装
切片是一个引用类型,它的内部结构包含地址、长度和容量
切片定义 var name []T 例如: var a []string //声明一个字符串切片 ,此时未分配内存空间,==nil var b = []int{1,2,3} //声明一个int切片并初始化 注意: 切片是引用类型,不支持直接比较,只能和nil比较 求切片长度:len() 求切片容量:cap() //切片容量是指底层数组的容量
切片底层是一个数组,我们可以基于数组切片得到切片 切片是引用类型,都指向了底层的一个数组 例如: a := [5]int{1, 2, 3, 4, 5} s := a[:3]
make()函数构造切片
使用方法:
make([]T, size, cap)
说明:
T:切片的元素类型
size:切片中元素的数量
cap:切片的容量
例如:
a := make([]int, 2, 10)
判断一个切片是否是空的,要是用len(s) == 0来判断,不应该使用s == nil来判断。
var s1 []int //这样直接定义的切片,并未分配内存空间,是nil
切片赋值拷贝和循环 由于切片底层都指向了一个数组,所以赋值后,修改其中一个另一个值也改变 a1 := make([]int, 3) //[0 0 0] a2 := a1 //a1和a1都指向底层同一个数组 a2[0] = 100 切片的遍历方式和数组是一致的,支持索引遍历和for range遍历
切片添加元素append() append可以一次加一个元素,也可以加多个元素,也可以加另一个切片钟元素(后面加…) var s []int s2 := []int{5, 6, 7} s = append(s, 1) s = append(s, s2...) 注意: 1、通过var声明的零值切片可以在append()函数直接使用,无需初始化 2、append追加元素,原来底层数组放不下时,go底层会把底层数组换一个,切片就会自动按照一定的策略进行“扩容”
copy()函数复制切片
copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中
copy(destSlice, srcSlice []T)
例如:
copy(c, a) //使用copy()函数将切片a中的元素复制到切片c,修改c中数据不会影响a中的
go语言中并没有删除切片元素的专用方法,我们可以使用切片和append方式实现删除
例如:
要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]...)