一尘不染

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

go

您可以在Go Playground上运行示例代码

这是代码:

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不会修改其参数。


阅读 212

收藏
2020-07-02

共1个答案

一尘不染

参见http://blog.golang.org/go-slices-usage-and-
internals。

如果要追加到切片的内容不适合当前切片的容量,则append函数 可以 分配新的基础数组。Append 确实会
修改基础数组。您必须将其分配回变量的原因是,正如我在第一句中所说的那样,可以重新分配基础数组,而旧切片仍将指向旧数组。

看到这个播放示例,以确切地了解我在说什么。

2020-07-02