当使用引用同一个数组的多个切片时,必须非常小心给定切片何时停止对原始数组进行操作。并且有多种情况导致这种情况。
在下面的例子中,对于相同类型的追加操作,根据追加元素的多少,结果/结果是非常不同的。
尽管我理解为什么行为不同以及为什么它不能保持一致或相同(无需解释),但它看起来确实是一种令人困惑的语言行为。另一个类似的情况是在其中一个切片中添加单个值。这也最终创建了一个新的支持数组,即使元素总数仍然适合原始容量。
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))
}
不期望有什么不同,而是试图理解语言的基本原理。