【问题标题】:Golang - How to "convert" an array ( [ ] ) to a list ( ... )?Golang - 如何将数组( [ ] )“转换”为列表( ... )?
【发布时间】:2015-05-15 21:34:55
【问题描述】:

我正在使用 UI 库 (https://github.com/andlabs/ui) 制作一个关于学生小组的程序。

ui.SimpleGrid 允许输入控件的“列表”:

func NewSimpleGrid(nPerRow int, controls ...Control) SimpleGrid

我觉得在 Java 和其他语言中,它就像一个数组一样工作,这基本上意味着给它一个就可以了。但是,这在 Go 中似乎不一样。

func initStudentsGrid(students ...Student) ui.SimpleGrid {
var i int
var grd_studentsList []ui.Grid

for i = 0; i < len(students); i++ {
    grd_student := ui.NewGrid()

    grd_student.Add(ui.NewLabel(students[i].group), nil, ui.West, true, ui.LeftTop, true, ui.LeftTop, 1, 1)
    grd_student.Add(ui.NewLabel(students[i].lastName), nil, ui.West, true, ui.LeftTop, true, ui.LeftTop, 1, 1)
    grd_student.Add(ui.NewLabel(students[i].firstName), nil, ui.West, true, ui.LeftTop, true, ui.LeftTop, 1, 1)

    grd_studentsList = append(grd_studentsList, grd_student)
}

return ui.NewSimpleGrid(1, grd_studentsList)

程序没有编译,因为:

不能在 ui.NewSimpleGrid 的参数中使用 grd_studentsList(类型 []ui.Grid)作为类型 ui.Control:[]ui.Grid 没有实现 ui.Control(缺少 ui.containerHide 方法)

有什么方法可以将数组“转换”为所需的格式,因为不可能一个一个地添加网格(SimpleGrid 上没有 append 方法)?

【问题讨论】:

    标签: arrays go


    【解决方案1】:

    尝试类似:

    return ui.NewSimpleGrid(1, grd_studentsList...)
                                               ^^^^
    

    这在规范Passing arguments to ... parameters中有所提及。

    【讨论】:

    • 给小费的坦克,但它也不起作用......(不能在 ui.NewSimpleGrid 的参数中使用 grd_studentsList(类型 []ui.Grid)作为类型 []ui.Control)
    • 所以将grd_studentsList 设为[]ui.Control。假设 Grid 类型符合接口,其余代码应该可以工作。
    【解决方案2】:

    它也不行……

    cannot use grd_studentsList (type `[]ui.Grid`) as type `[]ui.Control`
    in argument to `ui.NewSimpleGrid`
    

    正如我之前提到的(“What about memory layout means that []T cannot be converted to []interface{} in Go?”),您不能将A[] 隐式转换为[]B

    您需要先复制:

    var controls []ui.Control = make([]ui.Control, len(grd_studentsList))
    for i, gs := range grd_studentsList{
        controls [i] = gs
    }
    

    然后使用正确的切片(使用正确的类型)

     return ui.NewSimpleGrid(1, controls...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2022-10-07
      相关资源
      最近更新 更多