Golang - 如何将数组([])“转换”为列表(...)?

时间:2015-03-13 11:56:16

标签: arrays go

我使用UI lib(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)

该程序未编译,因为:

  

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

有没有办法做某种&#34;演员&#34;从数组到所需的格式,因为不可能逐个添加网格(在SimpleGrid上没有附加方法)?

2 个答案:

答案 0 :(得分:8)

尝试类似:

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

规范Passing arguments to ... parameters中提到了这一点。

答案 1 :(得分:4)

  

它也不起作用......

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...)