散记04:切片

01

一:

切片是基于数组做的一层封装。它底层存储数据的数据结构还是数组,只是通过封装屏蔽掉了不同类型数组(指不同长度)之间的差异,但由于数组的不可变和长度固定,也就意味着,它的每一次对数组长度的改变本质上就是改变底层数组。正因如此,切片结构中的数组成员实际上应该是首地址。因此,切片是一个引用类型。

二:

由于切片对数组做的封装可以让灵活扩容(至少在程序员视角来说是如此),因此,对于数组能做的事情,切片可以胜任(因其本身就是基于数组的),而数组所不能触及的事情(多是限于类型严格和不可变),切片同样可以胜任,因此,对于需要用“多个相同类型数据集合”的地方,基本上都使用切片而抛弃数组。数组只是做切片的底层支撑。

02

一:

切片结构由三个成员组成——数组地址、元素数量(长度)、切片容量,容量假如没有特别定义,就和长度一致。它既可以直接定义,也可以从数组、字符串、其他切片中切来(使用表达式“待切片数组[low:high]”)。它从low和high这两个索引值得知该定义多长的数组,里面有哪些元素,此时它的容量和长度一致。

二:

对一个切片再切片时,要注意它high的上限以其容量为限,而不是长度。还有一种表达式为“待切片数组[low:high:max]”,其中max-low可以看做是新切片定义的容量,但也并不超过原切片的容量,一般来说,这种表面是“max”,而实质却是“max-low”的写法,极其容易引起误解,所以不建议使用。需要注意的是,新切片的底层数组指向的就是待切片数组,任何对切片造成内容修改,都是反应在待切片数组上。

03

一:

一个切片等于nil的意思是指,它的数组指针所指向的地址为空值,也就是没有指向一个明确的地址。由于没有数组,所以该切片的长度和容量均为0.

二:

因为切片实质是用数组指针指向数组地址,而它本身是没有数据内容的,因此我们通过判断一个切片为nil并不能表示切片的长度为0,虽然切片为nil时,该切片的长度和容量均为0,但是,如果数组指针指向一个无数据的空数组,虽然该切片不为nil,但却依然是长度为0,如果是通过判断一个切片为nil就认定该切片为空,那么很显然这种情况就是不为空,这就有逻辑错误。因此应该通过判断长度来判断切片是否为空。

04

一:

Go语言的内建函数copy(目标切片,数据来源切片)函数可以迅速地将一个切片中的数据复制到另一个切片中,这并不是简单数组指针的赋值更改,而是将数据来源切片指向的数组的元素逐个赋值给目标切片指向的数组。

二:

也就意味着,要保证目标切片和数据来源切片二者的数组指针都有明确的指向,也就都要有初始化这一过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值