当前位置: 首页 > 网络应用技术

Golang Slice在-Depth分析中,踏上坑记录

时间:2023-03-07 16:25:05 网络应用技术

  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的切片操作默认情况下都是浅副本。触发器的扩展只会使两个切片指向不同的阵列。在实际业务中,许多场景需要深层复制。目前,您可以使用复制功能