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