golang Slice切片

切片是struct结构,又称为动态数组,

type slice struct { arrary unsafe.Pointer len int cap int }

两个关注点

  • 切片长度
  • 切片容量

怎么使用:

  • 创建slice

// 1. 生成一个空切片,并且初始元素个数为n,默认值为对应类型的空值,比如int为0。c为容量 s := make([]int, 10, 20) // 2. 空切片 nil,不分配内存 var s [] int // 3. 通过数组创建 var t = s[5:9]

  • 添加元素 append

s := make([]int, 0, 20) // 此操作在容量不够的情况下会自动扩容 // 扩容时,会分配比现在更大的内存,然后将原来的元素拷贝到新分配的空间;最后添加新值 // 扩容策略,当小于1024时,扩大为原来2倍容量。相当于原来100,扩容后200 // 当容量大于等于1024时,通常会扩容到原来1.25倍, // 具体扩容时,还会考虑元素类型与内存分配规则,对实际扩张值做一些微调 s = append(s, 1)

  • 获取长度 len(slice) 时间复杂度 O(1)
  • 获取容量 cap(slice) 时间复杂度 O(1)
  • 拷贝 copy(slice)拷贝是不会发生扩容
  • 切片随机访问

slice[n] 可通过下标直接访问对应的元素

  • 切取子切片

通过切片获取另一个切片时,生成的切片和源切片共享底层数据组

    • 简单表达式 a[low:high]
      • slice[m:n] 截取 [m,n) 之间的元素,并生成新的切片,新切片的len为 n-m ,容量为 cap(slice)-m
      • slice[:] 等同于 slice[0:len(slice)]
      • slice[0:] 等同于 slice[0:len(slice)]
      • slice[:len(slice)] 等同于 slice[0:len(slice)]
    • 扩展表达式 a[low:high:max]
      • max 限制新生成的切片的容量,也就是,新生成的切片容量为 max-low,而不是共享源切片的最大容量

s := make([]int, 5, 10) // cap(a) 为 cap(s)-3 也就是 7 a := s[3:5] // cap(b) 为2 b := s[3:5:5]

关于越界问题:

切片的越界和容量有关,当下标超过切片容量时,会触发panic

其他说明:

切片进行切取时,子切片和原来的切片会共享底层的数组空间,因此在使用子切片时,如果需要对子切片进行修改,最好通过copy的方式进行拷贝后操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值