Struct 如何创建不同类型的结构数组数组?

Struct 如何创建不同类型的结构数组数组?,struct,go,slice,Struct,Go,Slice,在我的项目中,我得到了两个模型: type User struct { Name string } type Article struct { Title string } 我得到了这些结构的数据数组: users := []User articles := []Article 我试图在同一段代码中对这两个部分进行迭代: models := [][]interface{} {users, articles} for _, model := range models {

在我的项目中,我得到了两个模型:

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

我做错了什么?

你应该使用
[]接口{}
而不是
[]接口{}

试穿一下

如果要迭代内部数组中的所有结构,需要将它们转换为适当的类型,然后进行迭代,如下所示:

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

上尝试一下如何使用接口来解决您的问题?您甚至可以使用默认的
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)
    }
}

操场:

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

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

这是不可能做到的。Go是静态类型的。重新设计您的解决方案。您不能将任何切片转换为
[]接口{}
。有关解释和解决方案,请参阅。@Volker,icza谢谢你们,伙计们。@WhiteAngel“走的路”使用的是接口,我发布了一个可能会有所帮助的解决方案:)谢谢你们的回复。但这正是我试图避免的-
switch
语句和检查类型。在本例中,我将使用重复块,对每种类型执行完全相同的操作。所以,Go不允许你以干净的方式做这件事?对我来说,问题是我可能有10种不同的型号,甚至更多。也许你可以使用接口来实现这一点?@RoninDev就像我的回答一样?@PabloFernandez完全正确