Go中Fyne的NewVBox使用切片省略号展开报错的原因及解决方法
问题解答
1. 报错原因
container.NewVBox的函数签名为func NewVBox(objects ...CanvasObject) *Container,它接收可变长度的fyne.CanvasObject接口类型参数。
你逐个传入btns[0]、btns[1]时,每个*widget.Button类型的变量会自动隐式转换为CanvasObject接口类型,因此可以正常运行。
但Go语言不支持直接将[]*widget.Button类型的切片用...展开传入要求[]CanvasObject类型的参数位置:即使切片元素实现了目标接口,整个切片的类型是独立的,Go不会自动完成整个切片的元素类型转换,这就是类型不匹配报错的根本原因。
2. 正确实现方式
你只需要先将按钮切片转换为[]fyne.CanvasObject类型的切片,再用...展开传入即可,参考修改后的代码:
package main import ( "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) func main() { a := app.New() w := a.NewWindow("Button List") btn0 := widget.NewButton("button 0", func() { fmt.Println("Pressed 0") }) btn1 := widget.NewButton("button 1", func() { fmt.Println("Pressed 1") }) btns := []*widget.Button{btn0, btn1} // 转换为CanvasObject切片 var objs []fyne.CanvasObject for _, btn := range btns { objs = append(objs, btn) } vbox := container.NewVBox(objs...) w.SetContent(vbox) w.ShowAndRun() }
内容的提问来源于stack exchange,提问作者ThisEndUp
相关产品推荐
相关产品推荐

