重新分配slice参数的行为有所不同

时间:2019-01-01 01:57:05

标签: go

package main

import "fmt"

func main() {
    paths := []string{"hello", "world", "mars"}
    var result = delete(paths, 1)
    fmt.Println(result)
    fmt.Println(paths)
}

func delete(paths []string, index int) []string {
    paths = append(paths[:index], paths[index+1:]...)
    return paths
}

上面的代码结果如下:

  

[你好火星]

     

[你好,火星]

如您所见,第二个fmt.Println(paths)显然使用了修改后的片,但没有使用重新分配的值。这是为什么?我原本希望它像以前一样打印[hello mars]

我知道传递的pathspaths函数中的delete()参数期望引用同一基础数组的切片不同。但是我仍然不明白如何更改传递给paths函数的delete的基础数组,因为它显示的是[hello mars mars]而不是[hello world mars]

1 个答案:

答案 0 :(得分:1)

因为,正如您所说,使用了相同的基础数组。进行追加时,paths[:1]是长度为1且容量为3的切片,而paths[2:]是长度为1的切片,因此第一个切片的基础数组中有足够的空间来追加新值,而不分配新数组。 paths中的main仍然是长度为3的切片,因为它从未被修改过,但是由于底层数组已被修改(特别是元素1),因此您将看到所看到的值。

如果您还没有的话,可能要看一下https://blog.golang.org/go-slices-usage-and-internals