为了账号安全,请及时绑定邮箱和手机立即绑定

重新分配切片参数的行为不同

重新分配切片参数的行为不同

Go
千万里不及你 2023-05-22 17:38:44
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 的切片,因此第一个切片的底层数组中有足够的空间来追加新值而无需分配新数组。pathsinmain仍然是长度为 3 的切片,因为它从未被修改过,但是由于底层数组被修改了(特别是元素 1),您会看到您看到的值。


查看完整回答
反对 回复 2023-05-22
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信