Go语言之切片

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

切片的定义

由于数组长度固定、类型局限性大、无法追加元素等缺陷存在,在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
}

输出如下所示:

[]
[]
[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))
}

输出如下所示:

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)]

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

fu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值