golang中的slice

概念

    Slice即切片,它和数组(array)很类似,可以用下标的方式进行访问。如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。

1,slice源码

// runtime/slice.go
type slice struct {
    array unsafe.Pointer // 元素指针
    len   int // 长度 
    cap   int // 容量
}

可以看出,slice 共有三个属性

1) 指针,指向底层数组; 

2)长度,表示切片可用元素的个数,也就是说使用下标对 slice 的元素进行访问时,下标不能超过 slice 的长度; 

3)容量,底层数组的元素个数,容量 >= 长度。在底层数组不进行扩容的情况下,容量也是 slice 可以扩张的最大限度。

注意:底层数组是可以被多个 slice 同时指向的,因此对一个 slice 的元素进行操作是有可能影响到其他 slice 的。

2,slice的创建

// 1)直接声明
var slice []int
// 2) new关键字
slice := *new([]int)
// 3)字面量
slice := []int{1,2,3,4,5}
// 4)make
slice := make([]int, 5, 10)
// 5) 从数组/切片中截取
slice := array[1:5] 或 slice := sourceSlice[1:5]

注意

第一种创建出来的 slice 其实是一个 nil slice。它的长度和容量都为0。和nil比较的结果为true。这里比较混淆的是empty slice,它的长度和容量也都为0,但是所有的空切片的数据指针都指向同一个地址 0xc42003bda0。空切片和 nil 比较的结果为false

空切片的定义:

var slice = []int{}
var slice = make([]int,0)

make函数需要传入三个参数:切片类型,长度,容量。当然,容量可以不传,默认和长度相等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值