【Go】26、golang切片
- 前面我们学习了数组,数组是固定长度,可以容纳相同数据类型的元素的集合。当长度固定时,使用还是带来一些限制,比如:我们申请的长度太大浪费内存,太小又不够用
- 鉴于上述原因,我们有了go语言的切片,可以把切片理解为,可变长度的数组,其实它底层就是使用数组实现的,增加了自动扩容功能。切片(Slice)是一个拥有相同类型元素的可变长度的序列。
0、补充
- 切片是可索引的,并且可以由 len() 函数获取长度
- 切片提供了计算容量的函数 cap() 可以测量切片最长可以达到多少:它等于切片的长度 + 数组除切片之外的长度。如果s 是一个切片, cap(s) 就是从 s[0] 到数组末尾的数组长度。切片的长度永远不会超过它的容量,所以对于 切片s 来说该不等式永远成立: 0 <= len(s) <= cap(s)
- 多个切片如果表示同一个数组的片段,它们可以共享数据;因此一个切片和相关数组的其他切片是共享存储的,相反,不同的数组总是代表不同的存储。数组实际上是切片的构建块。
- 因为切片是引用,所以它们不需要使用额外的内存并且比使用数组更有效率,所以在 Go 代码中 切片比数组更常用。
1、go语言切片的语法
- 声明一个切片和声明一个数组类似,只要不添加长度就可以了
var identifier []type- 切片是引用类型,可以使用make函数来创建切片
var slice1 []type = make([]type, len)
# 也可以简写为
slice1 := make([]type, len)- 也可以指定容量,其中capacity为可选参数
make([]T, length, capacity)- 这里的len是数组的长度也是切片的初始长度
2、go语言切片定义方式
- 第一种方式:
- 语法:
# 语法
var name []T
# 不初始化,定义的切片是空- name:表示变量名
- T:表示切片中的元素类型
func f1() {
// 定义切片,不初始化返回的是空
var s1 []int
var s2 []string
var s3 []bool
fmt.Printf("s1: %v\n", s1)
fmt.Printf("s2: %v\n", s2)
fmt.Printf("s3: %v\n", s3)
}
# 输出结果:
s1: []
s2: []
s3: []- 第二种方式:
- 语法:
# 语法
var name = make([]T, size, cap)
# 使用make定义切片,可以规定切片的长度,不初始化返回的初值默认是0,字符串是''等- T:切片的元素类型
- size:切片中元素的数量
- cap:切片的容量
func f2() {
// 使用make定义切片,可以规定切片的长度,不初始化返回的初值默认是0,字符串是''等
var s4 = make([]int, 3)
fmt.Printf("s4: %v\n", s4)
var s5 = make([]string, 2)
fmt.Printf("s5: %v\n", s5)
var s6 = make([]float32, 2)
fmt.Printf("s6: %v\n", s6)
}
# 输出结果:
s4: [0 0 0]
s5: [ ]
s6: [0 0]3、go语言切片的长度和容量
- 切片拥有自己的长度和容量,我们可以通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量
func f3() {
// 切片的容量和长度
var s1 = []int{1, 2, 3}
fmt.Printf("len(s1): %v\n", len(s1))
fmt.Printf("cap(s1): %v\n", cap(s1))
// 通过下标访问切片的元素值
fmt.Printf("s1[0]: %v\n", s1[0])
}
func main() {
f3()
}
# 输出结果:
len(s1): 3
cap(s1): 3
s1[0]: 1本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16399528.html

浙公网安备 33010602011771号