Golang slices 和它们的支持数组行为不那么明显(附加示例)

问题描述 投票:0回答:0

当使用引用同一个数组的多个切片时,必须非常小心给定切片何时停止对原始数组进行操作。并且有多种情况导致这种情况。

在下面的例子中,对于相同类型的追加操作,根据追加元素的多少,结果/结果是非常不同的。

  • slc3 和 slc4 指的是同一块 slc,具有相同的后备数组。
  • 当我们将一个元素附加到 slc3 时,此更改对 slc 和 slc4 都是可见的。
  • 现在我们向 slc4 追加一些项目(刚好超过容量),行为非常不同。所做的更改对 slc 和 scl3 不可见,因为 slc4 现在在不同的底层阵列上运行。

尽管我理解为什么行为不同以及为什么它不能保持一致或相同(无需解释),但它看起来确实是一种令人困惑的语言行为。另一个类似的情况是在其中一个切片中添加单个值。这也最终创建了一个新的支持数组,即使元素总数仍然适合原始容量。

package main

import "fmt"

func main() {
slc := make([]int, 0, 10)
    slc = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

    fmt.Println("appending to slc at the back w/ and w/out exceeding capacity:")
    slc3 := slc[3:7]
    slc4 := slc[3:7]
    fmt.Printf("slc: %p:%v\nslc3:%p:%v\nslc4:%p:%v\n", slc, slc, slc3, slc3, slc4, slc4)
    slc3 = append(slc3, 111)
    slc4 = append(slc4, []int{111, 22, 33, 44, 55, 66}...)
    fmt.Printf("slc: %p:%v size:%d cap:%d\nslc3:%p:%v size:%d cap:%d\n", slc, slc, len(slc), cap(slc), slc3, slc3, len(slc3), cap(slc3))
    fmt.Printf("slc: %p:%v size:%d cap:%d\nslc4:%p:%v size:%d cap:%d\n\n", slc, slc, len(slc), cap(slc), slc4, slc4, len(slc4), cap(slc4))
}

不期望有什么不同,而是试图理解语言的基本原理。

go append slice
© www.soinside.com 2019 - 2024. All rights reserved.