🔄 遍歷集合的方法 🔄
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
迭代器模式提供了一種方法來遍歷集合的元素,而不需要揭示該集合的底層結構。這意味著你可以輕鬆地更換底層數據結構,而不影響其它使用該集合的部分。
想像一下,你正在設計一家書店的系統,其中有一個功能是列出所有的書籍。
package main
import "fmt"
type Book struct {
Title string
Author string
}
type BookList struct {
Books []*Book
}
type Iterator interface {
HasNext() bool
Next() *Book
}
type BookIterator struct {
index int
books []*Book
}
func (it *BookIterator) HasNext() bool {
return it.index < len(it.books)
}
func (it *BookIterator) Next() *Book {
if it.HasNext() {
book := it.books[it.index]
it.index++
return book
}
return nil
}
func main() {
harryPotter := &Book{"Harry Potter", "J.K. Rowling"}
lordOfTheRings := &Book{"Lord of the Rings", "J.R.R. Tolkien"}
myBookList := &BookList{
Books: []*Book{harryPotter, lordOfTheRings},
}
iterator := &BookIterator{books: myBookList.Books}
for iterator.HasNext() {
book := iterator.Next()
fmt.Printf("📖 %s by %s\n", book.Title, book.Author)
}
}
// Output:
// 📖 Harry Potter by J.K. Rowling
// 📖 Lord of the Rings by J.R.R. Tolkien
現在想像一家餐廳的菜單,你可以使用迭代器模式來遍歷各種菜餚!
package main
import "fmt"
type Dish struct {
Name string
Price float64
}
type Menu struct {
Dishes []*Dish
}
type DishIterator struct {
index int
dishes []*Dish
}
func (it *DishIterator) HasNext() bool {
return it.index < len(it.dishes)
}
func (it *DishIterator) Next() *Dish {
if it.HasNext() {
d := it.dishes[it.index]
it.index++
return d
}
return nil
}
func main() {
steak := &Dish{"Steak", 100}
chicken := &Dish{"Chicken", 95}
menu := &Menu{
Dishes: []*Dish{steak, chicken},
}
iterator := &DishIterator{dishes: menu.Dishes}
for iterator.HasNext() {
dish := iterator.Next()
fmt.Printf("🍜 %s costs %.2f\n", dish.Name, dish.Price)
}
}
// Output:
// 🍜 Steak costs 100.00
// 🍜 Chicken costs 95.00
無論你在書店、餐廳還是你的日常生活中,迭代器模式都無處不在,幫助我們輕鬆地遍歷各種集合。下次當你在燒烤派對上或是選購你最愛的書籍時,請記得,迭代器模式正在背後默默地幫助你!🎉