赞
踩
前言:本文主要记录了切片的定义、切片的比较、切片的拷贝、遍历,以及如何给切片追加元素。
由于数组长度固定、类型局限性大、无法追加元素等缺陷存在,在Go中引入了切片(slice)。
切片的底层是数组,它是一个拥有相同类型元素的可变长度的序列,支持新元素的添加,可用于快速的操作一块数据的集合。
切片是引用类型,改变切片会改变底层数组,其包含了地址
、长度
、容量
属性。切片的基本语法如下所示:
// var 关键字 //name 变量名 //T 数据类型 var name []T //声明示例 func main() { //声明切片的类型 var slice1 []int var slice2 = []string{ } var slice3 = []bool{ true, false} //var slice4 = []bool{true, false} fmt.Println(slice1) fmt.Println(slice2) fmt.Println(slice3) fmt.Println(slice1 == nil) fmt.Println(slice2 == nil) fmt.Println(slice3 == nil) //fmt.Println(slice3 == slice4) 会直接报错,因为切片是引用类型,不支持直接比较,只能判断是否为nil }
输出如下所示:
[]
[]
[true false]
true
false
false
切片的长度和容量是不一样的属性值。切片的长度指的是切片所包含的元素的个数,切片的容量是指从第一个元素开始,到切片底层数组的末尾元素的个数。
切片的长度可以用函数len()
来求,切片的容量用cap()
来求。
在make造切片中会看到两者明显的差别。
切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种表达方式:一种是表达式中的start
和end
表示一个索引范围(左开右闭的区域)的简单形式,另一种是再第一种上指定容量的完整形式。
因为切片的底层是一个数组,所以可以基于数组来得到一个切片,其长度等于end-start
的值,容量等于数组首个元素开始得到切片的底层数组的容量,如下示例:
func main() {
ar := [6]int{
0, 1, 2, 3, 4, 5}
slice := ar[1:3] //slice := ar[start,end]
fmt.Printf("slice: %v, slice len is:%d ,slice cap is:%d ", slice, len(slice), cap(slice))
}
输出如下所示:
slice: [1 2], slice len is:2 ,slice cap is:5
这种简单形式可以省略掉start
和end
,如下所示:
ar[1:] //等同于 ar[1:len(ar)]
ar[:3] //等同于 ar[0:3]
ar[:] //等同于 ar[0:len(ar)]
索引越界:当0 <= start <= end <= len(ar)
的时候索引合法,否则便会索引越界。
切片再切片:对切片再进行切片表达式时,end的上界限为切片的容量cap(ar)
,而不是切片的长度len(ar)
。
索引:索引常量必须是非负数,并且可以用int
类型来表示,也必须在有效范围内,否则会在运行时panic
。
综上示例如下:
fu
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。