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

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切片不同。但我仍然不明白我是如何改变传递给function的底层数组而不是.pathsdelete()pathsdelete[hello mars mars][hello world mars]


千万里不及你
浏览 89回答 1
1回答

婷婷同学_

因为,正如您所说,正在使用相同的底层数组。当你进行追加时,paths[:1]是一个长度为 1 且容量为 3 的切片,并且paths[2:]是一个长度为 1 的切片,因此第一个切片的底层数组中有足够的空间来追加新值而无需分配新数组。pathsinmain仍然是长度为 3 的切片,因为它从未被修改过,但是由于底层数组被修改了(特别是元素 1),您会看到您看到的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go