День 20 — глубже
Всё здесь необязательно. Материалы на английском помечены.
Про срезы
- Go blog: Go Slices: usage and internals (англ.) — https://go.dev/blog/slices-intro Заголовок среза, подсрез и рост через
append— с теми же картинками «окно на массив», что в дне 17. - Go blog: Arrays, slices (and strings): The mechanics of append (англ.) — https://go.dev/blog/slices Почему
appendвозвращает срез и что происходит, когда ёмкость кончилась. - Пакет slices (англ.) — https://pkg.go.dev/slices Читается и локально:
go doc slices,go doc slices.Clone.
Про map
- Go blog: Go maps in action (англ.) — https://go.dev/blog/maps Нулевое значение,
v, ok, обход и порядок. Раздел про параллельный доступ пока пропустите — он про блок горутин. - Пакет maps (англ.) — https://pkg.go.dev/maps
maps.Keysв связкеslices.Sorted(maps.Keys(m))возвращает итератор. Что это такое, в курсе не разбирается: связку пользуются как готовой.
Про строки и файлы
- Go blog: Strings, bytes, runes and characters in Go (англ.) — https://go.dev/blog/strings Байты, руны,
for rangeпо строке — с разбором того, почемуlenсчитает байты. - Пакет unicode/utf8 (англ.) — https://pkg.go.dev/unicode/utf8
RuneCountInString,RuneLen,ValidString. - Пакет encoding/csv (англ.) — https://pkg.go.dev/encoding/csv Готовый разборщик CSV: кавычки, разделитель внутри поля, номера строк в ошибках. В задаче 1 он не нужен — формат выгрузки простой, — но в настоящей выгрузке кавычки встречаются. Разделитель
;задаётся полемCommaу читателя.
Мини-опыты
1. Сколько раз растёт ёмкость. Числа роста ёмкости в курсе не учат наизусть, но посмотреть на них полезно один раз. Программа для черновика:
Код для чтения · разбираем, набирать не нужно
s := []int{}
for i := 0; i < 20; i++ {
s = append(s, i)
fmt.Println(len(s), cap(s))
}Смотрите, на каких строках cap меняется, — это моменты, когда append выделил новый массив. Правило 29 говорит, что в таблицу такое число не вычисляют, а берут из вывода.
2. Одна буква — несколько байтов. В черновике напечатайте []byte("Ёж") и []rune("Ёж"): в первом срезе четыре числа, во втором — два.
3. Порядок map. Запустите пять раз подряд программу, которая печатает for k, v := range m по map из десяти ключей, и сравните первые строки. Потом замените обход на slices.Sorted(maps.Keys(m)) и запустите ещё пять раз.