如何在go中使用带有for循环的列表

问题描述 投票:1回答:1

我想将数字附加到列表中,但是我的分片仅在for循环中更新值。

如何在外部更新它?

slice := []int{5,4,3,2,1}

for i := 0; i < len(slice); i++ {
    slice := append(slice, i)
    fmt.Println(slice)
}

fmt.Println(slice)

实际结果

[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1]

预期结果

[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1 0 1 2 3 4]

此代码在Python中有效,但是在执行过程中我没有发现某些问题

arrays loops for-loop go slice
1个回答
1
投票

由于您使用append()而不是slice,因此不会将short variable declaration的结果存储在“原始” assignment中:

slice := append(slice, i)

简短的变量声明(由于它与原始slice变量位于不同的块中)创建新变量(遮盖外部的slice),并在循环内打印此新变量。因此,每个追加的结果仅在循环体内可见,并且在迭代结束时丢失。而是使用赋值:

slice = append(slice, i)

但是,执行此操作时,将得到一个无限循环,因为您的循环条件为i < len(slice),并且slice在每次迭代中都会增长。

相反,您应该执行以下操作:

for i, length := 0, len(slice); i < length; i++ {
    slice = append(slice, i)
    fmt.Println(slice)
}

输出将是(在Go Playground上尝试):

[5 4 3 2 1 0]
[5 4 3 2 1 0 1]
[5 4 3 2 1 0 1 2]
[5 4 3 2 1 0 1 2 3]
[5 4 3 2 1 0 1 2 3 4]
[5 4 3 2 1 0 1 2 3 4]

请注意,如果使用for range,将会得到相同的结果,因为那样只会对切片进行一次评估:

for i := range slice {
    slice = append(slice, i)
    fmt.Println(slice)
}

Go Playground上尝试此。

© www.soinside.com 2019 - 2024. All rights reserved.