当前位置:   article > 正文

Go语言之切片_go语言的切片size和cap的关系

go语言的切片size和cap的关系

前言:本文主要记录了切片的定义、切片的比较、切片的拷贝、遍历,以及如何给切片追加元素。

切片的定义

由于数组长度固定、类型局限性大、无法追加元素等缺陷存在,在Go中引入了切片(slice)。
切片的底层是数组,它是一个拥有相同类型元素的可变长度的序列,支持新元素的添加,可用于快速的操作一块数据的集合。
切片是引用类型,改变切片会改变底层数组,其包含了地址长度容量属性。切片的基本语法如下所示:

// var	关键字
//name	变量名
//T		数据类型
var name []T

//声明示例
func main() {
   
	//声明切片的类型
	var slice1 []int
	var slice2 = []string{
   }
	var slice3 = []bool{
   true, false}
	//var slice4 = []bool{true, false}

	fmt.Println(slice1)
	fmt.Println(slice2)
	fmt.Println(slice3)
	fmt.Println(slice1 == nil)
	fmt.Println(slice2 == nil)
	fmt.Println(slice3 == nil)
	//fmt.Println(slice3 == slice4)	会直接报错,因为切片是引用类型,不支持直接比较,只能判断是否为nil
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出如下所示:

[]
[]
[true false]
true
false
false

切片的长度和容量

切片的长度和容量是不一样的属性值。切片的长度指的是切片所包含的元素的个数,切片的容量是指从第一个元素开始,到切片底层数组的末尾元素的个数。
切片的长度可以用函数len()来求,切片的容量用cap()来求。

在make造切片中会看到两者明显的差别。

切片的表达式

切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种表达方式:一种是表达式中的startend表示一个索引范围(左开右闭的区域)的简单形式,另一种是再第一种上指定容量的完整形式。

简单形式

因为切片的底层是一个数组,所以可以基于数组来得到一个切片,其长度等于end-start的值,容量等于数组首个元素开始得到切片的底层数组的容量,如下示例:

func main() {
   
	ar := [6]int{
   0, 1, 2, 3, 4, 5}
	slice := ar[1:3] //slice := ar[start,end]

	fmt.Printf("slice: %v, slice len is:%d ,slice cap is:%d ", slice, len(slice), cap(slice))
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出如下所示:

slice: [1 2], slice len is:2 ,slice cap is:5

这种简单形式可以省略掉startend,如下所示:

ar[1:]	//等同于 ar[1:len(ar)]
ar[:3]	//等同于	ar[0:3]
ar[:]	//等同于 ar[0:len(ar)]
  • 1
  • 2
  • 3

索引越界:当0 <= start <= end <= len(ar)的时候索引合法,否则便会索引越界。
切片再切片:对切片再进行切片表达式时,end的上界限为切片的容量cap(ar),而不是切片的长度len(ar)
索引:索引常量必须是非负数,并且可以用int类型来表示,也必须在有效范围内,否则会在运行时panic
综上示例如下:

fu
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/206339
    推荐阅读
    相关标签
      

    闽ICP备14008679号