gpt4 book ai didi

go - 为什么追加修改传递的 slice

转载 作者:IT王子 更新时间:2023-10-29 00:55:47 25 4
gpt4 key购买 nike

我如何遍历 slice 并将 slice 传递到除当前元素之外的某处?似乎 append() 函数修改了底层 slice ,正如我们在文档中看到的那样。但无论如何我仍然不知道如何达到这一点。

func main() {
args := []string{ "2", "3", "8" }

for i, _ := range args {
fmt.Println(append(args[:i], args[i+1:]...)) // or pass to function
}

fmt.Println(args)
}

结果:

[3 8]
[3 8]
[3 8]
[3 8 8] // it is args now

我的期望:

 [3 8]
[2 8]
[2 3]

我已经看过了 Why does append() modify the provided slice? (See example)

但是slice的Capacity是多少对我来说是个 secret ,我不明白为什么我超过了它。

最佳答案

性能是主要原因。创建一个新的 slice 并将所有元素复制到它是昂贵的,所以 slice 代码不会无缘无故地复制。但是,如果超出 slice 的容量,它会通过复制底层 slice 来适当增长。这意味着从 append 返回的 slice 可能与您传入的 slice 不同。

首选的使用方式是:

args = append(args, newarg)

如果您采用子 slice ,容量保持不变,但您对 slice 的看法会发生变化。这意味着丢失的元素仍然存在,但在新 slice 的边界之外。

这解释了代码的奇怪输出。您正在打印 append 的结果每次但不存储该结果,这意味着 args与您打印的内容不一样。

初始args slice 有 3 个元素大。对于每个索引 i - 也就是说 0 , 12 - 你拿一个子 slice args[:i]并追加数组剩余部分的所有元素 args[i+1:]给它。这意味着:

i    args[:i]     args[i+1:]...   Result         args
0 {} {"3", "8"} {"3", "8"} {"3", "8", "8"}
1 {"3"} {"8"} {"3", "8"} {"3", "8", "8"}
2 {"3", "8"} {} {"3", "8"} {"3", "8", "8"}

tl;dr 您应该始终保存 append 的结果, 如果你想制作一个副本以便你可以更改它然后自己制作一个副本。

关于go - 为什么追加修改传递的 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35920534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com