1

我一直在学习在 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 的东西导致这种行为出现?更重要的是,处理这个问题的正确方法是什么?谢谢!

4

1 回答 1

1

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

for i:=0;i<address.childrenCount;i++{
    index := i
    content.Add(widget.NewButton(address.children[i].text,func(){
        fmt.Println(index)
    }))
}
于 2021-03-14T09:33:21.720 回答