gpt4 book ai didi

go - slice 迭代顺序

转载 作者:IT王子 更新时间:2023-10-29 02:25:13 30 4
gpt4 key购买 nike

好吧,我认为这可能是一个老问题,但我没有在 stackoverflow 上找到任何东西。在 go 中,不保证 map 上的迭代顺序是可重现的。因此,建议的方法是将键保存在一个 slice 中并对该 slice 进行排序。然后遍历该 slice 以从映射中检索值,以便我们按顺序获取它们(由于由键组成的 slice 已排序,因此将以可重现的顺序排列)。所以这意味着需要对 slice 进行排序,否则 slice 上的迭代也不会给出可重现的顺序。但是当我在 Playground 上尝试下面的代码时,我总是发现迭代中维护的顺序,那么在 map 迭代的情况下,为什么需要对键的 slice 进行排序?

func main() {
var mySlice = make([]string, 0)
mySlice = append(mySlice, "abcd")
mySlice = append(mySlice, "efgh")
mySlice = append(mySlice, "ijkl")
mySlice = append(mySlice, "mnop")
mySlice = append(mySlice, "qrst")
mySlice = append(mySlice, "uvwxyz")
for _, val := range mySlice {
fmt.Println(val)
}
fmt.Println(strings.Join(mySlice, "|"))

}

输出:

abcd
efgh
ijkl
mnop
qrst
uvwxyz
abcd|efgh|ijkl|mnop|qrst|uvwxyz

最佳答案

slice 或数组将始终具有固定顺序,即它在内存中的布局方式。

您正在阅读的文档可能只是告诉您对 slice 进行排序,以便 map 输出按排序顺序排列。

您是正确的, map 的迭代顺序是未定义的,因此每次执行时都可能不同。如果您使用 slice 来迭代映射,那么它将始终以可靠的顺序返回,即 slice 中键的顺序。

我建议您阅读有关slices 的信息.

编辑

如果有帮助,请考虑以下代码来说明 slice 的排序与其固定的顺序无关:

words := map[int]string{
0: "hello",
1: "there",
2: "goodbye",
}
keys:=[]int{2,0,1}
for _, k := range keys {
// Will output in order: Goodbye, hello, there
fmt.Println("Key:", k, "Value:", words[k])
}

关于go - slice 迭代顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45346641/

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