anotherSlice := theSlice
anotherSlice = append(anotherSlice, newEle)
fmt.Println(len(anotherSlice) == len(theSlice))

该代码片段将输出false。为什么?

这是其他一些实验:
package main

import "fmt"

func main() {
    theSlice := []int{3,3,2,5,12,43}
    anotherSlice := theSlice
    fmt.Println(anotherSlice[3], theSlice[3])
    anotherSlice[3] = anotherSlice[3]+2
    fmt.Println(anotherSlice[3], theSlice[3])
    anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)
    fmt.Println(len(anotherSlice),len(theSlice))
}

输出如下:
5 5
7 7
5 6

Program exited.

最佳答案

每当附加的 slice anotherSlice没有新元素的容量时,append函数就会创建新的 slice 并返回它。从那时起,片段anotherSlicetheSlice不同-它们由单独的数组支持。

以较短的anotherSlice[:3]长度对 slice 进行 slice 不会影响 slice 的原始容量。

下一行:

anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)

删除第四个(索引3)元素。由于anotherSlice[:3]具有保存anotherSlice[4:]的所有元素的能力,因此不会发生新分配,因此将修改两个片。
package main

import (
        "fmt"
)

func main() {
        x := []int{1, 2, 3, 4, 5, 6}
        fmt.Println(cap(x[:3]) >= len(x[:3])+len(x[4:]))
        y := append(x[:3], x[4:]...)
        fmt.Println(x, y)
}


  • Go Slices
  • Capacity function
  • Slice tricks
  • 关于go - 将引用类型为 “slice”的变量分配给另一个变量,为什么它们不同时更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36890875/

    10-10 03:04