Pertvarkyk main.go — tvarkingas atvaizdavimas ir patikra
Meniu ciklas lieka lygiai toks pat — mes pridedam dvi funkcijas ir vieną patikrą. Visa kita tavo main.go nepaliesta.
1. Teisinga pavadinimo patikra — validateTitle. Ji skaičiuoja simbolius (runes), ne baitus:
func validateTitle(title string) string {
title = strings.TrimSpace(title)
n := utf8.RuneCountInString(title)
if n == 0 {
return "Title cannot be empty."
}
if n > 60 {
return fmt.Sprintf("Title is too long: %d characters (max 60).", n)
}
return ""
}
Jei būtume rašę len(title) > 60, lietuviškas pavadinimas su „paukščiukais" būtų atmestas per anksti — len skaičiuoja baitus. Ši funkcija — tai 2 žingsnio spąstai, pritaikyti. (Į importus pridėk "unicode/utf8".)
2. Panaudok ją „Set title". Viena patikra case "2" viduje — patikrink prieš išsaugant:
case "2":
fmt.Print("New title: ")
title := readLine()
if msg := validateTitle(title); msg != "" {
fmt.Println(msg)
continue
}
it.Title = title
fmt.Println("Title set to:", title)
3. Tvarkingas, LYGIUOTAS atvaizdavimas — formatItem. %-30s lygiuoja pavadinimą kairėje 30 stulpelių lauke, %3d/%-3d užpildo skaičius, tad eilutės susilygiuoja:
func formatItem(it Item) string {
status := "reading"
if it.Read {
status = "done"
}
return fmt.Sprintf("%-30s %3d/%-3d [%s]", it.Title, it.PagesRead, it.Pages, status)
}
printItem dabar tik ją iškviečia — fmt.Println(formatItem(it)). 8 pamokoje, su daug įrašų, lygiavimas atsiperka: tvarkinga lentelė veltui.
Patikrink — nustatyk daugiažodį lietuvišką pavadinimą, tada parodyk:
> 2
New title: Ąžuolas ir uosis
Title set to: Ąžuolas ir uosis
> 1
Ąžuolas ir uosis 0/380 [reading]
Pavadinimas nuskaitytas visas (su tarpais — readLine iš 5 pamokos), o stulpeliai susilygiuoja.
Spąstai (
fmt.Scanlnir tarpai). Jei pavadinimą skaitysi sufmt.Scanln(&title), „Ąžuolas ir uosis" taps tik „Ąžuolas" — likusi eilutė lieka buferyje ir sujaukia kitą skaitymą. Daugiažodžiam tekstui visada skaityk visą eilutę sureadLine, neScanln.