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

我想将数字附加到列表中,但我的切片仅在 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 中运行,但在 go 中有些东西我没有发现


慕工程0101907
浏览 100回答 1
1回答

蓝山帝景

您不将结果存储append()在“原始”中slice,因为您使用短变量声明而不是赋值:slice := append(slice, i)短变量声明(因为它与原始slice变量位于不同的块中)创建一个新变量(隐藏外部slice),并在循环内打印这个新变量。因此,每次追加的结果仅在循环体内可见,并在迭代结束时丢失。而是使用赋值:slice = append(slice, i)但是,当您这样做时,您将得到一个无限循环,因为您的循环条件是i < len(slice),并且slice在每次迭代中都会增长。相反,你应该这样做(评估len(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上试试这个。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go