День 11 · дополнительные материалы

День 11 — глубже

Всё здесь необязательно. Материалы на английском помечены.


Тур по Go: функции (англ.)

Что говорит спецификация языка (англ.)

Effective Go: имена (англ.)

Git — книга Pro Git по-русски

Мини-опыты

1. Функция, которая вызывает функцию. В scratch/main.go объявите две функции: одна считает коробки, вторая — вес партии, и она вызывает первую.

✎ Наберите в файл scratch/main.go
package main

import "fmt"

func boxes(qty int) int {
	n := qty / 6
	if qty%6 != 0 {
		n++
	}
	return n
}

func weight(qty int) int {
	return qty*300 + boxes(qty)*120
}

func main() {
	fmt.Println("Вес партии:", weight(14), "г")
}

Составьте для неё таблицу трассировки с колонкой «где мы»: сколько разных имён в ней встретится и в каком порядке? Сколько раз вы уйдёте в функцию и вернётесь?

2. Сколько раз вычисляется аргумент. Замените в main вызов на weight(boxes(14)). Что теперь передаётся в weight? Посчитайте ответ заранее, потом проверьте запуском.

3. Параметр с тем же именем, что переменная снаружи. В программе со второй страницы переименуйте параметр n в qty — так, чтобы и в main, и в функции переменная называлась одинаково. Изменится ли что-нибудь в выводе? Почему? (Полный ответ — завтра, в дне 12, в разделе про затенение.)

4. Функция без параметров. Бывает и такая: func header() string, которая всегда возвращает одну и ту же строку-заголовок таблицы. Напишите её и вызовите. Чем она отличается от константы из дня 03 и когда лучше константа?

Попробуйте сейчас: заглянуть внутрь истории и вернуть файл.

Цель: увидеть, как выглядит коммит изнутри, и вернуть испорченный файл одной командой.

1. Что хранит git. В папке дня после первого коммита:

▶ Выполните
cd ~/gocourse/day11
git log --oneline
git show --stat
git cat-file -p HEAD

Последняя команда печатает сам коммит в том виде, в каком он лежит на диске: дерево файлов, автор, дата, сообщение. Пока это просто любопытно; в блоке 7, когда появятся ветки, из этого сложится картина.

2. Как вернуться к сохранённому. Испортите нарочно черновик — удалите в нём пару строк, — посмотрите, что об этом скажет git, и верните файл таким, каким он был в последнем коммите:

▶ Выполните
git status
git diff
git restore scratch/main.go
git status

Готово, когда: после git restore команда git status снова говорит working tree clean, а в черновике вернулись удалённые строки.

Это то, ради чего всё и затевалось: сохранённое состояние возвращается одной командой. Работает только для того, что уже попало в коммит, — ещё один повод коммитить чаще.