Go语言入门【6】切片
创始人
2024-01-29 08:14:30

切片

在go语言中,切片是对数组的抽象,数组在声明时指定了长度之后就不可再进行改变,在特定场景下数组就不适用,所以就有了切片类型,切片就是“动态数组”,和数组相比,切片的长度是不固定的,可以在切片后面追加元素,长度自动扩容。

切片定义

定义切片和定义数组很像,区别就是定义一个切片不需要指定长度。

var 切片名 []类型

切片还可以使用make函数定义。

make([]T, length, capacity)

make函数有三个参数:

  1. 第一个参数为切片类型,可以是[]int,[]string,[]float32等。
  2. 第二个参数为切片初始长度。
  3. 第三个为切片容量,该参数为可选参数。

切片初始化

一个切片在初始化之前为空切片(nil),长度为0,可以在声明切片时直接初始化切片,如下表示声明一个int切片,初始化值为{1, 2, 3}

s :=[] int {1,2,3 }

初始化为数组的引用,假设有一个数组arr,在初始化为数组的引用时,通过开始索引和结束索引控制初始化的切片大小和切片内元素个数。

s := arr[startIndex:endIndex]	// 从 startIndex 到 endIndex - 1 初始化为一个切片
s := arr[startIndex:]			// 从 startIndex 到 数组结尾 初始化为一个切片
s := arr[:endIndex]				// 从 数组开始 到 endIndex - 1 初始化为一个切片
s := arr[:]						// 从 数组开始 到 数组结尾 初始化为一个切片(整个数组)

代码示例:

package mainimport "fmt"func main() {arr := [5]int{1, 2, 3, 4, 5}s1 := arr[:]s2 := arr[2:]s3 := arr[:3]s4 := arr[1:4]fmt.Println(s1)fmt.Println(s2)fmt.Println(s3)fmt.Println(s4)
}

运行结果:

运行结果

append和copy

append表示在一个切片的末尾追加元素。

copy表示复制一个切片里面的元素到另一个切片。

代码示例:

package mainimport "fmt"func main() {s := []int{1,2,3}fmt.Println("切片s:",s)s = append(s, 4)					// 添加一个元素4到切片s中fmt.Println("切片s:",s)s1 := make([]int, 4)copy(s1, s)											// 将切片s的内容拷贝到切片s1中fmt.Println("切片s1:",s1)
}

运行结果:

运行结果

切片截取

切片截取使用中括号[],通过指定需要截取的开始索引和结束索引。

代码示例:

package mainimport "fmt"func main() {s := []int{1,2,3,4,5}fmt.Println("完整切片:", s)fmt.Println("s[1:3]:", s[1:3])			// 截取索引1(包含)到索引3(不包含)fmt.Println("s[:4]:", s[:4])			// 默认开始索引为0fmt.Println("s[2:]:", s[2:])			// 默认结束索引为len
}

运行结果:

运行结果

len和cap

长度和容量区别:

  • 长度:长度表示切片中实际存储的元素个数
  • 容量:容量表示切片底层使用的数组的大小

当定义一个切片时,如果没有通过make方法指定cap,则底层会申请一个和切片长度一样的数组,这个数组的大小就是cap,当使用append朝切片中追加元素时,如果追加元素后新的len小于cap,则底层数组不会改变,当新的len大于cap时,底层就会重新申请一个数组,且数组的长度为cap * 2,然后将之前数组的元素全部复制到新数组中。

代码示例:

package mainimport "fmt"func main() {s := make([]int, 3)fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// 此时len=3,cap=3s = append(s, 1)fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=4,大于cap,所以底层数组扩容,cap=6s = append(s, 1)fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=5,小于cap,底层数组不变,cap=6s = append(s, 1)fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=6,小于cap,底层数组不变,cap=6s = append(s, 1)fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=7,大于cap,所以底层数组扩容,cap=12
}

运行结果:

运行结果

关注专栏,持续更新

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...