2015-03-13 45 views
2

我使用UI庫(https://github.com/andlabs/ui)製作關於學生組的程序。Golang - 如何將數組([])「轉換」爲列表(...)?

的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(類型[] ui.Grid)作爲參數類型ui.Control到ui.NewSimpleGrid:[] ui.Grid未實現ui.Control(缺少ui.containerHide法)

有沒有辦法在一個陣列所需的格式做了一種「演員」,因爲它是不可能通過一個添加一個網格(在SimpleGrid上沒有附加方法)?

回答

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

嘗試類似:

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

這是在規範Passing arguments to ... parameters提及。

+0

坦克的小費,但它也不管用.. (無法使用grd_studentsList(類型[] ui.Grid)作爲類型[] ui.Control在參數爲ui.NewSimpleGrid) – Razakhel 2015-03-13 13:20:45

+0

因此,使'grd_studentsList' [] ui.Control'。假設網格類型符合接口,其餘的代碼應該工作。 – 2015-03-14 01:21:16