为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕工程0101907 2023-07-31 15:04:27
我想将数字附加到列表中,但我的切片仅在 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 中有些东西我没有发现
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您不将结果存储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上试试这个。



查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信