一尘不染

切片迭代顺序

go

好的,我认为这可能是一个老问题,但是我在stackoverflow上没有发现任何东西。在go中,不保证地图上的迭代顺序是可重现的。因此,建议的方法是将键保留在一个切片中并对该切片进行排序。然后,对该切片进行迭代以从映射中检索值,以便我们按顺序获取它们(因为由键组成的切片已排序,因此将以可再现的顺序排列)。因此,这意味着需要对切片进行排序,否则切片上的迭代也不会给出可重现的顺序。但是,当我在操场上尝试以下代码时,总是会发现迭代中保持了顺序,然后在地图迭代的情况下,为什么需要对键片进行排序?

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

阅读 227

收藏
2020-07-02

共1个答案

一尘不染

切片排序的唯一原因是因为您要按已排序的顺序附加项目。如果您按这样的未排序顺序附加项目

var mySlice = make([]string, 0)
mySlice = append(mySlice, "mnop")
mySlice = append(mySlice, "efgh")
mySlice = append(mySlice, "uvwxyz")
mySlice = append(mySlice, "ijkl")
mySlice = append(mySlice, "abcd")
mySlice = append(mySlice, "qrst")

(或通过从映射中拉出键填充切片,这将是未排序的),则迭代的顺序将是未排序的(一致,是,但始终未排序)。因此,如果您的目标是使用切片按排序顺序从地图中提取项目,则需要首先对切片进行排序,除非可以保证切片项目已按已排序的顺序插入。

2020-07-02