package mainimport "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切片不同。但我仍然不明白我是如何改变传递给function的底层数组而不是.pathsdelete()pathsdelete[hello mars mars][hello world mars]
1 回答
婷婷同学_
TA贡献1844条经验 获得超8个赞
因为,正如您所说,正在使用相同的底层数组。当你进行追加时,paths[:1]
是一个长度为 1 且容量为 3 的切片,并且paths[2:]
是一个长度为 1 的切片,因此第一个切片的底层数组中有足够的空间来追加新值而无需分配新数组。paths
inmain
仍然是长度为 3 的切片,因为它从未被修改过,但是由于底层数组被修改了(特别是元素 1),您会看到您看到的值。
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报
0/150
提交
取消