файн создает строки в контейнере из фрагмента контейнеров

# #go #variadic-functions #fyne

Вопрос:

Мне нужен срез под названием строки, содержащий число файнов.Контейнерные структуры. Затем мне нужно показать их все в виде строк в окне.

Я пытался сделать это:

 rows := []*fyne.Container{}
rows = append(
    rows, 
    container.New(
        layout.NewGridLayout(4),
        widget.NewLabel("Trigger"),
        widget.NewLabel("Text"),
        widget.NewLabel("Enter"),
        widget.NewLabel("Active"),
    ),
)

w.SetContent(
    container.New(
        layout.NewGridLayout(1),
        rows...
    ),
)
 

но я понимаю

невозможно использовать строки (введите []*fyne.Контейнер) как тип []fyne.CanvasObject в аргументе к контейнеру.Новый

И я не понимаю, почему, если я это сделаю:

 w.SetContent(
    container.New(
        layout.NewGridLayout(1),
        container.New(
            layout.NewGridLayout(4),
            widget.NewLabel("Trigger"),
            widget.NewLabel("Text"),
            widget.NewLabel("Enter"),
            widget.NewLabel("Active"),
        ),
        container.New(
            layout.NewGridLayout(4),
            widget.NewLabel("Trigger"),
            widget.NewLabel("Text"),
            widget.NewLabel("Enter"),
            widget.NewLabel("Active"),
        ),
    ),
)
 

Это прекрасно работает… Разве это не должны быть одни и те же передаваемые отдельные структуры или []типа…?

Спасибо!

Ответ №1:

Метод ожидает фрагмент fyne.CanvasObject s, который является интерфейсом, fyne.Container реализуемым структурой.

Фрагмент типа структуры нельзя использовать вместо фрагмента типа интерфейса, даже если тип структуры удовлетворяет интерфейсу.

Ваш срез должен быть типа интерфейса, а не типа структуры. Затем вы можете добавить объекты, соответствующие интерфейсу, в этот срез:

 rows := []fyne.CanvasObject{}
rows = append(
    rows, 
    container.New(
        layout.NewGridLayout(4),
        widget.NewLabel("Trigger"),
        widget.NewLabel("Text"),
        widget.NewLabel("Enter"),
        widget.NewLabel("Active"),
    ),
)