Tema
/
Struktūrinis programavimas GO
Pamoka 9 / 14 Žodynas (Go map) ~50 min

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 4 du kartus — dvi kategorijų eilutės gali sukeisti vietas. Go sąmoningai atsitiktinai maišo range per map, kad niekas nesiremtų tvarka, kurios niekada nebuvo žadėta. Nekovok su tuo; map skirtas paieškai ir skaičiavimui, ne tvarkai.