代码之家  ›  专栏  ›  技术社区  ›  Tarik

重新分配切片参数的作用不同

go
  •  -1
  • Tarik  · 技术社区  · 6 年前
    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 传递的切片与 路径 中的参数 delete() 函数应引用相同的基础数组。但我仍然不明白我是如何更改 路径 被传授给 delete 打印时的功能 [hello mars mars] 而不是 [hello world mars] .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andy Schweig    6 年前

    因为,正如您所说,正在使用相同的底层数组。当你做附加的时候, paths[:1] 是长度为1、容量为3的切片,并且 paths[2:] 是一个长度为1的切片,因此第一个切片的基础数组中有足够的空间在不分配新数组的情况下追加新值。 paths 在里面 main 仍然是一个长度为3的切片,因为它从未被修改过,但由于基础数组已被修改(特别是元素1),所以可以看到所看到的值。

    你可能想看看 https://blog.golang.org/go-slices-usage-and-internals 如果你还没有。