如何创建不同类型的struct数组?

时间:2015-09-04 12:36:50

标签: struct go slice

在我的课程中,我有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

我做错了什么?

3 个答案:

答案 0 :(得分:4)

您应该使用[]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 :(得分:1)

也许我没有得到你的要求,但只是

有什么问题
models := []interface{} {users, articles}
for _, model := range models {
    log.Printf("%#v\n", model)
}

答案 2 :(得分: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