Pertvarkyk main.go — skaičiavimas ir paieška
Dvi naujos galios TAVO programai, abi paremtos map. Item įgauna Category lauką (Add dabar jo klausia), o meniu — 4) Stats by category ir 5) Find by title. Add / List / Mark read lieka.
Išplėsk struktūrą ir Add veiksmą:
type Item struct {
Title string
Pages int
PagesRead int
Read bool
Category string // NAUJA
}
fmt.Print("Category: ")
category := readLine()
items = append(items, Item{Title: title, Pages: pages, Category: category})
Skaičiavimas pagal kategoriją — m[k]++ šablonas. Vienas pagalbininkas suglaudžia slice į kategorija → kiekis map:
func countByCategory(items []Item) map[string]int {
counts := make(map[string]int)
for _, it := range items {
counts[it.Category]++ // nesamas raktas prasideda nuo 0, tada +1
}
return counts
}
Jokio „ar jau mačiau šią kategoriją?" tikrinimo — nesamas raktas skaitosi kaip 0, tad ++ tiesiog veikia. showStats (meniu 4) pereina per skaičius ir juos atspausdina. Prisimink 2 žingsnį: ta tvarka atsitiktinė.
Paieška pagal pavadinimą — comma-ok su map[string]Item. Kartą pasidaryk paieškos lentelę, tada skaityk ją comma-ok idioma (meniu 5):
func indexByTitle(items []Item) map[string]Item {
index := make(map[string]Item, len(items))
for _, it := range items {
index[it.Title] = it
}
return index
}
case "5":
fmt.Print("Exact title: ")
index := indexByTitle(items)
if it, ok := index[readLine()]; ok {
fmt.Printf("Found: %s — %d pages, %s\n", it.Title, it.Pages, it.Category)
} else {
fmt.Println("Not found.")
}
Būtent ok daro tai saugu: nesamas pavadinimas duoda nulinį Item{} su ok == false, tad spausdini „Not found.", o ne tuščią įrašą.
Patikrink — pridėk tris knygas dviejose kategorijose, tada statistiką ir paiešką:
> 1
Title: Dune
Pages: 412
Category: sci-fi
Added: Dune
... (taip pat pridėk War and Peace / history, Hyperion / sci-fi)
> 4
sci-fi 2
history 1
> 5
Exact title: Dune
Found: Dune — 412 pages, sci-fi
> 5
Exact title: Unknown Book
Not found.
Spąstai (atsitiktinė map tvarka). Paleisk
4du kartus — dvi kategorijų eilutės gali sukeisti vietas. Go sąmoningai atsitiktinai maišorangeper map, kad niekas nesiremtų tvarka, kurios niekada nebuvo žadėta. Nekovok su tuo; map skirtas paieškai ir skaičiavimui, ne tvarkai.