在我的课程中,我有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
我做错了什么?
答案 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)
}
}
}
上试试
答案 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)
}
}