【问题标题】:ellipsis expansion fyne NewVBox省略号扩展 fyne NewVBox
【发布时间】:2021-10-17 13:36:56
【问题描述】:

我正在尝试创建一个带有一系列按钮的 Fyne 垂直框,但无法弄清楚基本机制。我认为这是一个 Go 问题,而不是 Fyne 问题,我对 Go 不太了解。

这是一个最小的程序来说明我的意思:

package main

import (
    "fmt"

    "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}

    vbox := container.NewVBox(
        // does work
        btns[0],
        btns[1],
        // doesn't work
        // btns...,
    )

    w.SetContent(
        vbox,
    )
    w.ShowAndRun()
}

我的理解是参数btns... 应该产生与参数列表btn[0], btn[1] 相同的效果,但显然不会。如果我注释掉这些行

    btn[0], 
    btn[1],

并取消注释该行

    btns...

我收到错误消息

不能使用 btns (type []*"fyne.io/fyne/v2/widget".Button) 作为类型 []fyne.CanvasObject 在 container.NewVBox 的参数中

所以,我的新手问题:

  • 这是怎么回事,也就是说,为什么btns... 不起作用?
  • 我应该改用什么作为 NewVBox 的参数?

【问题讨论】:

标签: go fyne


【解决方案1】:

要在此处执行您想要执行的操作,您需要将*widget.Button 的切片修改为fyne.CanvasObject 的切片。

当像这样扩展到可变参数时,类型必须与可变参数所期望的完全匹配。这意味着类型需要是接口本身,而不是实现接口的类型。

在您的情况下,以下将起作用:

btns := []fyne.CanvasObject{btn0, btn1}
vbox := container.NewVBox(btns...)

【讨论】:

  • 谢谢!我认为这是一个难题(以及在某些情况下,for 循环中的迭代变量如何最终成为最后一个值)。我不知何故怀疑这些是唯一会让熟悉其他语言的程序员感到惊讶的两件事,因此作为一种后续问题:是否存在此类“功能”的列表,如果有,在哪里?
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2020-10-12
相关资源
最近更新 更多