存储在列表中后如何在 Struct 实例上调用 func

How to call func on a Struct instance after storing in list

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

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 未定义(类型接口 {} 是没有方法的接口)

container/list is not "generic" and operates on interface{} values. To get "typed" values out of it, you have to use type assertion:

for comic := comicBookList.Front(); comic != nil; comic = comic.Next() {
    comic.Value.(comicBook).PrintInfo()
}

Go Playground 上试试。

但是你不应该首先使用 container/list

而是使用 slice。切片是通用的(在编译器的帮助下):

var books []comicBook

要向切片添加值,请使用内置函数 append():

b := comicBook.NewComicBook(...)
books = append(books, b)

要遍历切片,请使用 for range:

for _, b := range books {
    b.PrintInfo()
}

Go Playground 上试试。

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