GO语言非常有用,但是有一些坑。在初学者的Golang中,作者还踩了很多坑,以避免将来继续踏上坑,并为了能够为了更深入地了解切片的原则,本文拥有本文。
您可以首先查看以下情况。如果您可以正确回答并说出为什么,那么恭喜,您已经非常了解切片。
案例1:输出[1,2,3]
情况2:输出[10,2,3]
情况3:输出[1,2,3]
这里需要澄清两点:
1. Golang只有价值传输
2. Golang中的切片是一个结构,结构如下:
外部切片瘫痪至测试片,此处发生了副本。结构如下:
由于阵列的数量是在切片中保存的,因此这里的两个切片指向同一数组。因此,更改同一数组将影响两个切片。
但是,由于印刷切片由LEN控制,因此将尽快打印情况[1,2,3]。但两者将打印[10,1,2]。
通过强行修改Len,可以打印1、2、3、4
三个和一号和第二个情况之间的差异是情况三的初始容量是3,然后是1,2,3的三个要素。因此,切片在存在之前已满。
然后,附加发生在该函数中,从而导致数组的扩展。
逻辑逻辑:
1.根据策略申请较大的阵列空间(切片容量的扩展规则:当原始切片的盖小于1024时,新的切片盖变为原始的两倍;当原始切片的帽子大于1024时,新切片变成了原始的1.25次)
2.旧副本中的数据到新数组
3.添加新数据
4.将阵列的手复制到切片
扩展后,结构如下:
因此,功能的更改不会将数组更改为原始切片
可以通过以下方式看到,可以看到切片底层中的数组地址变化。可以发现前两个输出值是相同的,第三个输出是不同的。证明方向已更改的数组。
案例1:输出[10,2,3] [10,2,3,4]
情况2:输出[1,2,3] [10,2,3,4,5]
原理是相似的。如果附加过程没有扩展,则两个切片指向同一数组,如果发生容量,则指向不同的数组。
案例1:输出[10,2,3] [10,2]
情况2:输出[1 2 3] [10 2 11 12 13]
原理是相似的。如果附加过程没有扩展,则两个切片指向同一数组,如果发生容量,则指向不同的数组。
可以看出,Golang的切片操作默认情况下都是浅副本。触发器的扩展只会使两个切片指向不同的阵列。在实际业务中,许多场景需要深层复制。目前,您可以使用复制功能