go slice的切片操作浅析

今天和大家分享一下go的slice类型的切片操作。

何为go-slice和切片操作

首先,我们先来了解下go的Slice,slice是一个可变长指向底层数组的数据结构,由长度,容量指向底层数组的指针组成。

定义:

s := make([]T,len,cap)
   T:slice的具体类型
   Len:slice的长度
   Cap:slice的扩展,0<=len<=cap

声明(示例为其中一种):

a := []int{1,2,3}//声明和定义,此处也可看作同时定义了一个匿名的数组,变量a指向了这个数组的地址

slice有一个特性,多个slice之间可以共享底层数据,并且引用的数组部分区间可能重叠,通常可用slice的切片操作生成指向原slice的指针地址,长度(0<=len<=cap)可灵活调整的新切片,当然另一个方法是赋值(指针地址,长度容量和原slice一致),暂且不展开细说。今天着重说一下slice的切片操作。

切片操作定义:

slice [开始位置i : 结束位置j]
   Slice:表示目标的切片对象
   开始位置i:对目标切片开始索引(下标),0<=i<=cap,可省略,默认0
   结束位置j:对目标切片结束索引(下标),i<=j<=cap,可省略,默认len

slice的切片操作遵循左闭右开原则,取出元素的数量j-i

切片操作的边界问题

先说一下切片操作容易混淆和忽略的边界问题,简单来说就是两可两不可。

一 不可:获取len下标的值不可以
一   可:获取len开始的切片可以,将会得到新切片
二不可:获取超过==len<=cap下标的值不可以
二  可:获取==len<=cap的切片可以

下面我分别用代码实验证明上面的结论:

1.获取len下标的值

代码示例:

func main(){
   
    a := []int{
   1, 2, 3}
    fmt.Println(a, len(a), cap(a)) //[1 2 3] 3 3

    //获取len下标的值
    b := a[3]
    fmt.Println(b)

}

运行结果:

[1 2 3] 3 3
panic: runtime error: index out of range

2.获取len长度的切片

代码示例:

func main(){
   
   a := []int{
   1, 2, 3}
   fmt.Println(a, len(a), cap(a)) 

   //获取len长度的切片
   b := a[len(a):]
   fmt.Println(b, len(b), cap(b))
}

运行结果:

[1 2 3] 3 3
[] 0 0

3.生成一个len<cap的slice

为了验证结果更清晰,与上述产生明显对比,我需要生成一个len<cap的slice
代码示例:

func main(){
   
   a := []int{
   1, 2, 3}//长度3容量 3
   b := make([]int, 0, 6)//声明一个长度为0容量为6的切片指针变量b
   b =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值