一 切片的引入
先看一个实际需求:我们需要一个数组用于保存学生的成绩,但是学生的个数是不确定的,怎么办?
解决方案:使用切片。
二 切片的基本介绍
1 切片的英文是 slice。
2 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
3 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度 len(slice)都一样。
4 切片的长度是可以变化的,因此切片是一个可以动态变化数组。
5 切片定义的基本语法。
var 切片名 []类型
var a [] int
三 快速入门
1 代码
package main
import (
"fmt"
)
func main() {
// 演示切片的基本使用
var intArr [5]int = [...]int{1, 22, 33, 66, 99}
// 声明/定义一个切片
// slice := intArr[1:3]
// 1 slice 就是切片名
// 2 intArr[1:3] 表示 slice 引用到 intArr 这个数组
// 3 引用 intArr 数组的起始下标为 1,最后的下标为3(但是不包含3)
slice := intArr[1:3]
fmt.Println("intArr=", intArr)
fmt.Println("slice 的元素是 =", slice) // 22, 33
fmt.Println("slice 的元素个数 =", len(slice)) // 2
fmt.Println("slice 的容量 =", cap(slice)) // 切片的容量是可以动态变化
fmt.Printf("intArr[1]的地址=%p\n", &intArr[1])
fmt.Printf("slice[0]的地址=%p slice[0]==%v\n", &slice[0], slice[0])
slice[1] = 34
fmt.Println()
fmt.Println("intArr=", intArr)
fmt.Println("slice=", slice) // 22, 34
}
2 测试
intArr= [1 22 33 66 99]
slice 的元素是 = [22 33]
slice 的元素个数 = 2
slice 的容量 = 4
intArr[1]的地址=0xc04206e038
slice[0]的地址=0xc04206e038 slice[0]==22
intArr= [1 22 34 66 99]
slice= [22 34]
Process finished with exit code 0
四 切片在内存中形式
1 切片内存布局
2 分析总结
a slice 是一个引用类型
b slice 从底层来说,其实就是一个 struct 结构体。
type slice struct {
ptr *[2]int
len int
cap int
}