Tema
/
Struktūrinis programavimas GO
Pamoka 7 / 14 Eilutės (tekstas) ~50 min

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.Scanln ir tarpai). Jei pavadinimą skaitysi su fmt.Scanln(&title), „Ąžuolas ir uosis" taps tik „Ąžuolas" — likusi eilutė lieka buferyje ir sujaukia kitą skaitymą. Daugiažodžiam tekstui visada skaityk visą eilutę su readLine, ne Scanln.