标签:切片 26 s1 golang var 数组 Go 长度 make
- 前面我们学习了数组,数组是固定长度,可以容纳相同数据类型的元素的集合。当长度固定时,使用还是带来一些限制,比如:我们申请的长度太大浪费内存,太小又不够用
- 鉴于上述原因,我们有了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
标签:切片,26,s1,golang,var,数组,Go,长度,make 来源: https://www.cnblogs.com/guojie-guojie/p/16399528.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。