【问题标题】:Why don't Go slices just switch the underlying array on reallocation?为什么 Go 切片不只是在重新分配时切换底层数组?
【发布时间】:2016-06-24 16:51:13
【问题描述】:

切片包含三个组件:长度、容量和指向底层数组的指针。

当我们尝试 append 到已满的切片 (len(s) == cap(s)) 时,将分配更大的数组。

我在一本书中读到,我们必须将 append 的返回值分配回切片,因为由于底层数组的重新分配,可能会返回不同的切片。

runes = append(runes, r)

但我不知道为什么这是必要的。难道我们不能只重新分配一个新数组并更新原始切片实例的指针吗?

【问题讨论】:

    标签: go slice


    【解决方案1】:

    在 Go 中,所有函数参数都是按值传递的。函数不能改变调用者的值。

    切片(长度、容量、指针)按值传递给附加函数。因为 append 不能改变调用者的 slice,所以 append 函数返回新的 slice。

    可以编写 append 函数来获取指向切片的指针,但这会使 append 在切片值不可寻址的许多情况下难以使用。

    【讨论】:

    • 我认为最好解释一下为什么 append 不使用指向切片的指针。也许使用像append(foo() ,x)这样的例子?
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2019-07-29
    • 2019-12-16
    • 2016-08-10
    • 2012-11-10
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多