从 GUI 中的 for 循环分配适当的值

Assigning proper value from for loop in GUIs

我一直在学习用于在 Go 中制作 GUI 的 Fyne 库,并且 运行 遇到了问题。

func createResponses(content *fyne.Container){
for i:=0;i<address.childrenCount;i++{
    content.Add(widget.NewButton(address.children[i].text,func(){
        fmt.Println(i)
    }))
}}

这应该遍历一个节点的子节点,添加一个带有存储在该节点中的文本的按钮,然后在单击时打印 i 的值被创建到控制台。然而,虽然按钮的文本,即第一个参数 (address.children[i].text) 正确显示,但 i 的值始终打印出相同的值,如 3 ,导致循环终止的数字。

起初我虽然这是 Fyne 的一个特定问题,或者我对如何使用 Go 的一般理解不佳,但我记得我第一次学习 JavaFX 时遇到过类似的问题。是否有关于 GUI 的某些东西导致出现这种行为?更重要的是,处理这个问题的正确方法是什么?谢谢!

这与在 for 循环中使用延迟函数有关。到代码执行时,i 变量将处于最后一个值。解决方案是在将值传递给回调之前“捕获”该值。

for i:=0;i<address.childrenCount;i++{
    index := i
    content.Add(widget.NewButton(address.children[i].text,func(){
        fmt.Println(index)
    }))
}