为什么append()会修改提供的切片? (见例)

时间:2013-06-30 22:01:22

标签: go

你可以在Go Playground上run the example code

以下是代码:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}

    fmt.Println(numbers)
    _ = append(numbers[0:1], numbers[2:]...)
    fmt.Println(numbers)
}

输出:

[1 2 3 4 5]
[1 3 4 5 5]

为什么numbers切片会被追加修改?这是预期的行为,如果是的话,你能解释一下为什么吗?我认为append不会修改其论点。

1 个答案:

答案 0 :(得分:9)

请参阅http://blog.golang.org/go-slices-usage-and-internals

如果附加到切片的内容不适合当前切片的容量,则附加功能可以分配新的基础数组。附加 修改基础数组。你必须分配给变量的原因是因为,正如我在第一句中所说的,底层数组可以重新分配,旧切片仍将指向旧数组。

请参阅this play example,了解我正在谈论的内容。