前言
大家好,我是沐风晓月,本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言,持续更新中,欢迎点赞收藏。
🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业,阿里云博客专家
😉😉 💕 座右铭:先努力成长自己,再帮助更多的人,一起加油进步
🍺🍺🍺💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
文章目录
一. 切片的定义
1.1 切片的定义和特点
Go语言中的切片,是一种动态数组,它是对数组的引用,切片本身并不存储任何数据,它只是描述了数组中的一段。
切片有如下几个特点:
- 与数组相⽐,切⽚的⻓度是不固定的,可以追加元素,在追加时可能使切⽚的容量增⼤。
- 切⽚本身没有任何数据,它们只是对现有数组的引⽤。
- 切⽚与数组相⽐,不需要设定⻓度,在[]中不⽤设定值,相对来说⽐较⾃由。
- 切片是引用类型,默认值为nill
- 切片的索引也是从零开始
- 切片的遍历方式与数组相同
从概念上⾯来说slice像⼀个结构体,这个结构体包含了三个元素:
1)指针,指向数组中slice指定的开始位置;
2)长度,即slice的当前⻓度;
3)容量,也就是slice所容纳的最大元素个数。
1.2 切片的结构
切片是一种数据类型,这种数据类型便于使用和管理数据集合。
首先我们需要明白切片的结构。slice在Go的运行时库中就是一个C语言动态数组的实现:
type slice struct {
ptr *array //底层存储数组
len int //当前存储了多少个元素
cap int //底层数组可以存储多少个元素(从ptr指向的位置开始)
}
这个结构有3个字段,第一个字段表示array的指针,就是真实数据的指针(这个一定要注意),第二个是表示slice的长度,第三个是表示slice的容量,特别需要注意的是:
1.slice的长度和容量都不是指针
2.切片操作并不复制切片指向的元素。它创建一个新的切片并复用原来切片的底层数组。
切片操作并不复制切片指向的元素。它创建一个新的切片并复用原来切片的底层数组。 使得切片操作和数组索引一样高效。因此,通过一个新切片修改元素会影响到原始切片的对应元素。
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。
这 3 个字段分别是指向底层数组的指针、切片访问的元素的个数(即长度)和切片允许增长到的元素个数(即容量)。
二. 切片的声明和初始化
2.1 声明切片
1. 声明一个未指定长度的数组来定义切片
语法:
var slicename []type
- slicename : 表示变量名
需要注意的是: 该声明⽅式中未初始化的切⽚为空切⽚。该切⽚默认为 nil,⻓度为 0。
package main
import "fmt"
func main() {
var a []string //声明一个字符串切片
var b = []int{
} // 声明一个整数切片并初始化
fmt.Println(a, b, a == nil) // 执行结果 [] [] true
}
2. 使用make()的方式声明切片
语法:
var slice1 []type = make([]type, len, cap)
//type 表示切片的元素类型
//len 表示切片中元素的数量
//cap 表示切片的最大容量
可进行缩写:
- var slice1 []type = make([]type, len)
- 可以简写为: slice1 := make([]type, len)
案例一:使用make直接定义切片
package main
import "fmt"
func main() {
var mufeng2 []int = make([]int, 5, 7)
var mufeng2 []int = make([]int, 5) // 缩写
fmt.Println(mufeng2)
}
//执行结果: [0 0 0 0 0]
案例二:使用make定义并获相应的len,cap
package main
import "fmt"
f