Go语言切片

1. 什么是切片

go语言的切片是对数组的抽象

go数组的长度不可更改,在特定场景中这样的集合就不太适用,go中提供了一种灵活,功能强悍的内置类型切片(动态数组),与数组相比切片的长度是不固定的,可以追加元素,再追加时可能使切片的容量增大,比方说存放学生成绩,那学生的个数是不确定的,这样就可以用切片。

go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比做切糕的话,切片就是你要的“那一块”,切的过程包含从哪里开始(切片的起始位置)以及切多大(切片的大小),容量可以理解为装切片的口袋大小。

image-20240516144756794

  1. 切片的英文是slice
  2. 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵循引用传递的机制
  3. 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样
  4. 切片的长度是可以变化的,因此切片是一个可以动态变化的数组
  5. 切片定义的基本语法
1
2
3
var 切片名 [] 类型

var a [] int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import "fmt"

func main() {
var intArr [5]int = [...]int{1, 11, 22, 55, 76}
//1:3表示从数组中取出从1开始到3结束(不包含3)
slice := intArr[1:3]
fmt.Println("intArr=", intArr)
fmt.Println("slice的元素", slice)
fmt.Println("slice的元素的个数", len(slice))
fmt.Println("slice的容量", cap(slice))
fmt.Printf("slice的数据类型是%T\n", slice)
fmt.Printf("intArr[1]的地址=%p\n", &intArr[1])
fmt.Printf("slice[0]的地址=%p\n", &slice[0])
fmt.Println("......修改slice[1]=66......")
slice[1] = 66
fmt.Println("intArr=", intArr)
fmt.Println("slice的元素", slice)
}
/*
intArr= [1 11 22 55 76]
slice的元素 [11 22]
slice的元素的个数 2
slice的容量 4
slice的数据类型是[]int
intArr[1]的地址=0x14000126038
slice[0]的地址=0x14000126038
......修改slice[1]=66......
intArr= [1 11 66 55 76]
slice的元素 [11 66]
*/

2. 切片的创建

第一种方式,定义一个切片,然后让切片去引用一个已经创建好的数组

1
2
3
var intArr [5]int = [...]int{1, 11, 22, 55, 76}
//1:3表示从数组中取出从1开始到3结束(不包含3)
slice := intArr[1:3]

第二种方式

1
2
3
4
//type:切片的数据类型
//len:切片元素的个数
//cap:可选的,指定切片容量,如果分配了cap,则要求cap>=len
var 切片 []type = make([]type,len,[cap])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
var slice []float64 = make([]float64, 5, 10)
slice[1] = 10
slice[3] = 20
fmt.Println(slice)
fmt.Println("slice的size=", len(slice))
fmt.Println("slice的cap=", cap(slice))
}

/*
[0 10 0 20 0]
slice的size= 5
slice的cap= 10
*/

3. 切片的遍历

切面的遍历和数组一样,也有两种方式

第一种:常规的for循环遍历

第二种:for-range遍历切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import "fmt"

func main() {
var arr [5]int = [...]int{10, 20, 30, 40, 50}
slice := arr[1:4]
fmt.Println(slice)
for i := 0; i < len(slice); i++ {
fmt.Printf("slice[%v]=%v\n", i, slice[i])
}
for i, v := range slice {
fmt.Printf("i=%v,v=%v\n", i, v)
}
}

/*
[20 30 40]
slice[0]=20
slice[1]=30
slice[2]=40
i=0,v=20
i=1,v=30
i=2,v=40
*/

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!