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]
。
我知道传递的paths
与paths
函数中的delete()
参数期望引用同一基础数组的切片不同。但是我仍然不明白如何更改传递给paths
函数的delete
的基础数组,因为它显示的是[hello mars mars]
而不是[hello world mars]
。
答案 0 :(得分:1)
因为,正如您所说,使用了相同的基础数组。进行追加时,paths[:1]
是长度为1且容量为3的切片,而paths[2:]
是长度为1的切片,因此第一个切片的基础数组中有足够的空间来追加新值,而不分配新数组。 paths
中的main
仍然是长度为3的切片,因为它从未被修改过,但是由于底层数组已被修改(特别是元素1),因此您将看到所看到的值。
如果您还没有的话,可能要看一下https://blog.golang.org/go-slices-usage-and-internals。