День 11 — глубже
Всё здесь необязательно. Материалы на английском помечены.
Тур по Go: функции (англ.)
- A Tour of Go, Functions — https://go.dev/tour/basics/4 Страницы 4–7: функция, сокращённая запись параметров одного типа, несколько результатов (это завтрашний день) и именованные результаты. Код запускается прямо в браузере.
Что говорит спецификация языка (англ.)
- Function declarations — https://go.dev/ref/spec#Function_declarations Точное описание объявления. Там же — правило про
missing return: тело функции с результатом должно заканчиваться «терминирующим оператором». - Calls — https://go.dev/ref/spec#Calls Раздел, где сказано главное про сегодняшний день: «аргументы вычисляются и передаются по значению» — то есть внутрь уходит копия.
Effective Go: имена (англ.)
- https://go.dev/doc/effective_go#names Как в Go принято называть функции и пакеты; откуда берётся правило про заглавную первую букву и что она значит на самом деле.
Git — книга Pro Git по-русски
- Основы Git — https://git-scm.com/book/ru/v2/Введение-Основы-Git Первая глава: зачем нужна история и чем git отличается от «папки с копиями по датам».
- Запись изменений в репозиторий — https://git-scm.com/book/ru/v2/Основы-Git-Запись-изменений-в-репозиторий Подробно про
add,commit,status,diffи.gitignore— всё то, что было на седьмой странице, с картинками состояний файла.
Мини-опыты
1. Функция, которая вызывает функцию. В scratch/main.go объявите две функции: одна считает коробки, вторая — вес партии, и она вызывает первую.
scratch/main.gopackage 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, а в черновике вернулись удалённые строки.Это то, ради чего всё и затевалось: сохранённое состояние возвращается одной командой. Работает только для того, что уже попало в коммит, — ещё один повод коммитить чаще.