gpt4 book ai didi

go - golang 范围表达式的奇怪行为

转载 作者:IT王子 更新时间:2023-10-29 01:18:48 26 4
gpt4 key购买 nike

我有这个测试代码,它只是从一个 int slice 中删除偶数:

package main

import "fmt"

func main() {
a := []int{0, 1, 2, 3}
for i, v := range a {
fmt.Printf("i: %d v: %d\n", i, v)
fmt.Println("before", a)
if v%2 == 0 {
// delete a[i]
a = append(a[:i], a[i+1:]...)
}
fmt.Println("after", a, "\n")
}
fmt.Println("final", a)

}

输出是:

i: 0 v: 0
before [0 1 2 3]
after [1 2 3]

i: 1 v: 2
before [1 2 3]
after [1 3]

i: 2 v: 3
before [1 3]
after [1 3]

i: 3 v: 3
before [1 3]
after [1 3]

final [1 3]

您也可以在这里找到它 http://play.golang.org/p/BFPxekBggS .我的问题是为什么变量 v 在最后两次迭代中的计算结果为 3?提前致谢。

最佳答案

在内部, slice 就像一个包含三个元素的结构:

  • 支持阵列
  • 支持数组的大小,可以作为cap(slice)
  • 访问
  • slice 的长度,可以用len(slice)
  • 来访问

在你的循环运行之前,a 的支持数组是 [0, 1, 2, 3] with cap(a) == len(a ) == 4

当您使用以下代码修改a时:

a = append(a[:i], a[i+1:]...)

a 的新值共享原始支持数组,因为新长度小于容量。因此在第一次迭代中修改后,支持数组现在包含 [1, 2, 3, 3]len(a) == 3。数组中的最后一个元素通过普通 slice 操作不可见,但保留其旧值。

在第二次迭代中, slice 再次被缩短,所以支持数组现在是 [1, 3, 3, 3] with len(a) == 2 .

现在,当循环运行时,range 表达式只计算一次,因此无论您在循环中做出什么更改,它总是会产生 4 次迭代。它还将从同一个支持数组返回结果,这解释了您看到的数字。

关于go - golang 范围表达式的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154286/

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