List 如何在列表中存储后对结构实例调用func

List 如何在列表中存储后对结构实例调用func,list,go,struct,func,List,Go,Struct,Func,我尝试过搜索,但找不到如何执行此操作。 我想获取我的结构的实例并将它们存储在一个列表中,然后遍历它们并对它们调用函数 type comicBook struct { Title string Writer string Artist string Publisher string Year int Pages int Grade float32 } func (c comicBook) Prin

我尝试过搜索,但找不到如何执行此操作。 我想获取我的结构的实例并将它们存储在一个列表中,然后遍历它们并对它们调用函数

type comicBook struct {
    Title     string
    Writer    string
    Artist    string
    Publisher string
    Year      int
    Pages     int
    Grade     float32
}
func (c comicBook) PrintInfo() {
    fmt.Println(c.Title, "written by", c.Writer, "drawn by", c.Artist, "published by", c.Publisher, "in", c.Year)
    fmt.Println("Pages:", c.Pages)
    fmt.Println("Grade:", c.Grade)
}
这个很好用

c := comicBook.NewComicBook(
        "Mr. GoToSleep",
        "Tracey Hatchet",
        "Jewel Tampson",
        "DizzyBooks Publishing Inc.",
        1997,
        14,
        6.5,
    )

c.PrintInfo()

c2 := comicBook.NewComicBook("Epic Vol. 1",
        "Ryan N. Shawn",
        "Phoebe Paperclips",
        "DizzyBooks Publishing Inc.",
        2013, 160, 9.0)

c2.PrintInfo()
将它们存储在列表中并不需要

comicBookList := list.New()
    comicBookList.PushBack(c)
    comicBookList.PushBack(c2)

    fmt.Println("\nNow from a list!\n")

    for comic := comicBookList.Front(); comic != nil; comic = comic.Next() {
        comic.Value.PrintInfo()
    }
对于comic.Value.PrintInfo未定义类型接口{}是没有方法的接口

不是泛型的,对接口{}值进行操作。要从中获取键入的值,必须使用:

试穿一下

但是你一开始就不应该使用

相反,请使用一个。在编译器的帮助下,切片是通用的:

var books []comicBook
要向切片添加值,请使用内置的:

要在切片上迭代,请使用“范围”:

请在上尝试。

不是泛型的,并且对接口{}值进行操作。要从中获取键入的值,必须使用:

试穿一下

但是你一开始就不应该使用

相反,请使用一个。在编译器的帮助下,切片是通用的:

var books []comicBook
要向切片添加值,请使用内置的:

要在切片上迭代,请使用“范围”:


试一下。icza的答案是最好的方法。也就是说,您可以使用类型断言

for comic := comicBookList.Front(); comic != nil; comic = comic.Next() {
    realComic, ok := comic.Value.(comicBook)
    if !ok {
        panic("this would error anyway, but good for visibility")
    }
    realComic.PrintInfo()
}

@icza的答案是最好的方法。也就是说,您可以使用类型断言

for comic := comicBookList.Front(); comic != nil; comic = comic.Next() {
    realComic, ok := comic.Value.(comicBook)
    if !ok {
        panic("this would error anyway, but good for visibility")
    }
    realComic.PrintInfo()
}

您可能想查看此帖子。您使用的列表类型是什么?你为什么要用它而不是仅仅用一个切片呢?@Adrian我只是在学习Go,来自C。我原以为List是一个基本的容器,但我还没有意识到切片。icza给出的答案澄清了我的问题。我建议从官方文件开始。以包含所有语言基础知识(包括切片)的示例为例。同时阅读,它涵盖了如何思考和编写好的Go代码的基础知识。你可能想看看这篇文章。你使用的是什么列表类型?你为什么要用它而不是仅仅用一个切片呢?@Adrian我只是在学习Go,来自C。我原以为List是一个基本的容器,但我还没有意识到切片。icza给出的答案澄清了我的问题。我建议从官方文件开始。以包含所有语言基础知识(包括切片)的示例为例。同时阅读,它涵盖了如何思考和编写好的Go代码的基础知识。谢谢。这比列表方法更有意义。实际上,我在实现这一点时遇到了问题。comicBook结构位于另一个文件中,只是为了尝试通过管理导入来工作,并且由于其小写,因此不会导出。我尝试将其大写,并执行var comicBookList[]comicBook.comicBook,但下一行出现错误,即comicBook.comicBook没有字段或方法append。@galamdring append不是一个方法,它是一个函数。请再次检查您是如何使用它的:books=appendbooks,b谢谢。这比列表方法更有意义。实际上,我在实现这一点时遇到了问题。comicBook结构位于另一个文件中,只是为了尝试通过管理导入来工作,并且由于其小写,因此不会导出。我尝试将其大写,并执行var comicBookList[]comicBook.comicBook,但下一行出现错误,即comicBook.comicBook没有字段或方法append。@galamdring append不是一个方法,它是一个函数。请再次检查您是如何使用它的:books=appendbooks,b
for comic := comicBookList.Front(); comic != nil; comic = comic.Next() {
    realComic, ok := comic.Value.(comicBook)
    if !ok {
        panic("this would error anyway, but good for visibility")
    }
    realComic.PrintInfo()
}