1 回答
TA贡献1810条经验 获得超4个赞
返回值
你可以返回值。
func DoTimeConsumingStuff() int {
time.Sleep(1 * time.Second)
counter++
return counter
}
然后在单击按钮时生成一个匿名 goroutine,以免阻塞 UI。
counterButton := widget.NewButton("Increment", func() {
go func() {
counter := model.DoTimeConsumingStuff(counterChan)
UpdateCounterLabel(counter)
}()
})
打回来
您可以将该UpdateCounterLabel函数传递给您的模型函数,也就是回调。
func DoTimeConsumingStuff(callback func(int)) {
time.Sleep(1 * time.Second)
counter++
callback(counter)
}
counterButton := widget.NewButton("Increment", func() {
go model.DoTimeConsumingStuff(UpdateCounterLabel)
})
渠道
也许您还可以将一个通道传递给您的模型函数。但是使用上述方法,这似乎不是必需的。潜在地,如果你有不止一个反价值。
func DoTimeConsumingStuff(counterChan chan int) {
for i := 0; i < 10; i++ {
time.Sleep(1 * time.Second)
counter++
counterChan <- counter
}
close(counterChan)
}
然后在 GUI 中,您可以从通道接收,再次在 goroutine 中,以免阻塞 UI。
counterButton := widget.NewButton("Increment", func() {
go func() {
counterChan := make(chan int)
go model.DoTimeConsumingStuff(counterChan)
for counter := range counterChan {
UpdateCounterLabel(counter)
}
}()
})
当然,您也可以再次使用在每次迭代时调用的回调。
- 1 回答
- 0 关注
- 117 浏览
添加回答
举报