2015-09-04 124 views
2

在我的節目我有2種型號:如何創建不同類型的結構數組的數組?

type User struct { 
    Name string 
} 

type Article struct { 
    Title string 
} 

而且我得到了這些結構的數據數組:

users := []User 
articles := []Article 

我想在同一段代碼來遍歷他們兩人:

models := [][]interface{} {users, articles} 
for _, model := range models { 
    log.Printf("%#v", model) 
} 

但是我收到一個錯誤:

cannot use users (type []User) as type []interface {} in array element 

我在做什麼錯?

+1

這不能做。 Go是靜態類型的。重新設計解決方案。 – Volker

+2

您無法將任何切片轉換爲'[] interface {}'。有關解釋和解決方案,請參見[在接口中輸入轉換接口的切片](http://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go)。 – icza

+0

@Volker,icza謝謝,夥計們。 – WhiteAngel

回答

5

您應該使用的[]interface{}代替[][]interface{}
嘗試它的go playground

如果你想要遍歷所有的結構在你內心的數組,你需要將它們轉換爲正確的類型,然後重複,像這樣的:

for _, model := range models { 
    if u, ok := model.([]User); ok { 
     for _, innerUser := range u { 
      log.Printf("%#v", innerUser) 
     } 
    } 
    if a, ok := model.([]Article); ok { 
     for _, innerArticle := range a { 
      log.Printf("%#v", innerArticle) 
     } 
    } 
} 

嘗試它的go playground

+1

感謝您的回覆。但這正是我試圖避免的 - 「switch」語句和檢查類型。在這種情況下,我會有重複的塊,爲每種類型做完全相同的事情。那麼,Go不允許你以乾淨的方式做到這一點?對我來說,問題是我可能有10個不同的模型,甚至更多。 – WhiteAngel

+0

也許你可以使用它的接口? – RoninDev

+0

@RoninDev喜歡我的回答? –

0

如何使用接口解決您的問題?你甚至可以使用默認的fmt.Stringer接口,由fmt.Prtinf和其他標準方法使用。

例子:

package main 

import "log" 
import "fmt" 

type User struct { 
    Name string 
} 

type Article struct { 
    Title string 
} 

func (art Article) String() string { 
    return art.Title 
} 

func (user User) String() string { 
    return user.Name 
} 

func main() { 
    models := []interface{}{User{"user1"}, User{"user2"}, Article{"article1"}, Article{"article2"}} 
    for _, model := range models { 
     printable := model.(fmt.Stringer) 
     log.Printf("%s\n", printable) 
    } 
} 

遊樂場:https://play.golang.org/p/W3qakrMfOd

1

也許我沒有收到你的要求,但是這有什麼錯只是

models := []interface{} {users, articles} 
for _, model := range models { 
    log.Printf("%#v\n", model) 
} 
相關問題