Практикум · подписи функций и модуль проекта · Go

МДК.01.01 · разработка программных модулей · практикум · ветка Go

Практикум · Go

ПРАКТИКУМ · GO

Младший разработчик:
первая неделя

Ролевой практикум по модулю проекта и подписям функций на Go. Студент неделю работает стажёром в студии разработки: разворачивает проект, разбирает проблемы со сборкой, составляет подписи функций по заявкам заказчиков, решает, какие строки примет компилятор, и пишет подписи сам. В пятницу тимлид присылает рецензию, по которой собирается отчёт для GitHub.

1 пара · 90 минут4 письма + рецензияглавы 2.1–2.6, ветка Goработает в браузереотчёт .md
Открыть рабочий стол → Установка не нужна. Работа сохраняется в этом браузере.
Рабочий стол: слева письмо тимлида, в центре заявка кофейни и подпись функции FindGuestPhone с двумя результатами, справа каталог типов
Письмо 2, заявка 4. Слева письмо тимлида, в центре собранная подпись, справа каталог типов. У функции два результата: в слоте лежат string и bool.

§1Легенда

Студия «Верстак» пишет модули на Go для небольших компаний. Сейчас у неё пять заказчиков: колледж «Северный» с электронным журналом, кофейня «Зерно» с кассой, фитнес-клуб «Пульс», книжный магазин «Переплёт» и курьерская служба «Квартал».

Новые функции в студии начинают с подписи: какие параметры функция принимает, какого они типа и что возвращает. По подписи одна группа пишет тело функции, а другая — вызовы, и обе работают одновременно. Стажёр в первую неделю получает четыре письма с заданиями от тимлида.

Студия, её сотрудники и заказчики придуманы для практикума.

ВЫ
Стажёр Go-группыроль студента

Первая неделя в студии. Готовит рабочее место, составляет подписи функций по заявкам, проверяет чужие строки кода.

ИБ
Ирина Беловатимлид Go-группы

Присылает четыре письма с заданиями и в пятницу — рецензию с баллами.

ЧАТ
Денис, Лиза, Ксюша, Глеб, Марат, Оля, Тимурстажёры

Пишут в общий чат о проблемах со сборкой и присылают вывод терминала.

ЗК
Пять заказчиковдесять заявок

Описывают будущие функции словами бизнеса: что передаётся, что нужно получить, какие данные к расчёту не относятся.

§2Что отрабатывает каждое письмо

Практикум закрепляет две темы. Письмо 1 — модуль проекта и зависимости из темы 02, ветка Go. Письма 2–4 — подпись функции: простые типы, срезы, словари, time.Time, один и несколько результатов, результат с ошибкой. Запись подписи собрана в справке §3 на этой странице.

письмо 1 · рабочее местоМодуль и зависимости

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

письмо 2 · подписи по заявкамПеревести заявку в подпись

Выбрать из заявки данные, которые нужны функции, и подобрать каждому параметру и результату тип из каталога в 16 типов. Несколько результатов кладутся в слот по порядку.

письмо 3 · строки и подписьЧитать подпись как компилятор

По подписи решить, какие строки соберутся: число аргументов, тип каждого аргумента, сколько переменных принимает результат.

письмо 4 · подпись вручнуюНаписать строку func

Набрать подпись целиком по описанию. Разбор под полем показывает, как Go прочитает строку, и называет место ошибки записи.

§3Справка: подпись функции в Go

Подпись — первая строка функции: слово func, имя, параметры в скобках и типы результатов. Тип параметра пишется после его имени через пробел. Двоеточия и стрелки в подписи нет.

подписьодин параметр, один результат
func AverageGrade(grades []int) float64

Читается так: функция AverageGrade принимает срез целых чисел и возвращает дробное число.

Типы этой работы

ЗаписьЧто означаетПример значения
intцелое число25000
float64дробное число4.25
stringстрока, в двойных кавычках"Латте"
boolда или нетtrue, false
errorошибка; если её нет — nilnil
[]intсрез целых чисел любой длины[]int{5, 4, 4, 3}
[]stringсрез строк[]string{"+", "н"}
map[string]intсловарь: ключ — строка, значение — целоеmap[string]int{"Латте": 25000}
map[string][]intсловарь: ключ — строка, значение — срез целыхmap[string][]int{"Иванов Пётр": {5, 4}}
time.Timeмомент времени из пакета timetime.Now()

У среза скобки пустые и стоят перед типом элементов: []int. У словаря тип ключа стоит в скобках, тип значения — сразу после них: map[string]int.

Результаты: нет, один, несколько

ПодписьЧто возвращаетКак принять в вызове
func PrintReceipt(lines []string, width int)ничего: после скобки пустоPrintReceipt(lines, 32)
func CountAbsences(marks []string) intодно значениеn := CountAbsences(marks)
func FindGuestPhone(guests map[string]string, name string) (string, bool)значение и признак «найдено»phone, ok := FindGuestPhone(guests, "Анна")
func ParseQuantity(text string) (int, error)значение и ошибку; ошибка стоит последнейn, err := ParseQuantity("5")

Несколько результатов перечисляют в скобках через запятую, и их порядок входит в подпись: (string, bool) и (bool, string) — разные подписи. В вызове слева стоит столько переменных, сколько результатов. Ненужный результат принимают знаком подчёркивания: phone, _ := FindGuestPhone(guests, "Анна").

Чем подпись в Go отличается от подписи в Python

ЧтоPythonGo
Начало и конец строкиdef f(...) -> int:func F(...) int
Параметрgrades: list[int]grades []int
Словарьdict[str, int]map[string]int
Значение может отсутствовать-> str | None(string, bool)
Пара значений-> tuple[float, float](float64, float64)
Нет результата-> Noneпосле скобки ничего
Значение по умолчаниюwidth: int = 32нет: аргумент передают всегда
Кто сверяет вызов с подписьюотдельная программа проверкикомпилятор при go build

Имя функции с заглавной буквы видно из других пакетов: services.OrderTotal(...). Имя с маленькой буквы — orderTotal — доступно только внутри своего пакета. В заявках практикума все функции вызываются из другого пакета, поэтому имена начинаются с заглавной.

§4Неделя по письмам

Следующее письмо открывается кнопкой «Дальше» внизу текущего. Переход не зависит от ответов. До сдачи к любому открытому письму можно вернуться и поменять ответ.

Понедельник · письмо 1

Рабочее место

Три части на одной странице.

  • порядок команд: четыре шага от архива проекта без go.mod до запуска, три лишних шага остаются в наборе;
  • первый коммит: десять файлов и папок раскладываются по колонкам «В репозиторий» и «Остаётся на компьютере»;
  • чат стажёров: семь сообщений с выводом терминала, для каждого выбирается причина из списка девяти вариантов.
Письмо 1: шаги go mod init, go mod tidy и go run расставлены по порядку, файлы проекта разложены по двум колонкам
Часть 1: порядок команд собран, три лишних шага остались в наборе.
Вторник · письмо 2

Подписи по заявкам

Десять заявок от заказчиков. В каждой описана будущая функция и названы данные, часть которых функции не нужна: имя бариста, номер группы, имя кладовщика. Имя функции уже дано.

Нужные данные переносятся в подпись, затем каждому параметру и результату подбирается тип из каталога. Блоки переносятся перетаскиванием или нажатиями: тип — потом слот. У параметра один тип: новый заменяет прежний. Стрелка ↑ меняет порядок параметров.

Заявка 1: параметр grades с типом []int, результат float64, в наборе остались studentName и groupNumber
Заявка 1: grades перенесён в подпись, ФИО и номер группы остались в наборе.
Вторник · письмо 2

Результаты по порядку

В слот результата типы кладутся по порядку: два типа дают запись в скобках, например (int, error). Один и тот же тип можно положить дважды — (float64, float64). Пустой слот означает, что функция ничего не возвращает.

Под подписью показана строка, которая получилась, и её перевод на русский язык.

Строка func PrintReceipt(lines []string, width int) и её разбор: срез строк, целое число, результата нет
Заявка 8: слот результата пуст, и после скобки в строке ничего нет.
Среда · письмо 3

Строки и подпись

Пять подписей из вторника и к каждой восемь строк кода от второй группы. Строки раскладываются по колонкам «Соберётся» и «Не соберётся».

Проверяется число аргументов, тип каждого аргумента и приём результата: два результата нельзя принять одной переменной, а у функции без результата сохранять нечего. В рецензии под каждой строкой, которая не соберётся, показано сообщение компилятора Go.

Письмо 3: подпись FindGuestPhone и восемь строк, разложенных по колонкам «Соберётся» и «Не соберётся»
Подпись 2: три строки соберутся, пять — нет.
Четверг · письмо 4

Подпись вручную

Четыре заявки, поле ввода и разбор под ним. Разбор показывает, как Go прочитает строку: имя функции, каждый параметр с типом, результаты по порядку. Запись balance, visits int принимается наравне с balance int, visits int.

Если строка записана с ошибкой, под полем стоит отметка места и объяснение. Привычки из Python распознаются отдельно: двоеточие после имени параметра, стрелка перед результатом, str вместо string.

Поле с подписью, где после имени параметра стоит двоеточие, и сообщение: двоеточия в подписи Go нет
Двоеточие после averages: отметка стоит под ним, ниже — объяснение.
Пятница · рецензия

Рецензия

После кнопки «Сдать работу» ответы закрываются и открывается рецензия: баллы по письмам, темы для повторения и разбор каждого ответа с верным вариантом.

Слева — форма отчёта: фамилия, имя, группа и кнопка «Скачать отчёт .md».

Вкладка «Рецензия»: баллы по четырём письмам, итог 10 из 10 и форма отчёта слева
Рецензия после сдачи: баллы по письмам и форма отчёта.

§5Рецензия и оценка

Баллы рецензия считает по шкале ниже. В письме 2 заявка засчитывается, когда в подписи стоят все нужные параметры и нет лишних, у каждого параметра верный тип, а результаты совпадают по типам и по порядку. В письме 4 дополнительно сравниваются имя функции с учётом регистра и порядок параметров.

ПисьмоЧто считаетсяБаллы
1 · рабочее местоВерные ответы: порядок команд (1), файлы (10), причины из чата (7). 16–18 — 2 балла, 11–15 — 12
2 · подписи по заявкамВерные подписи: 9–10 — 4 балла, 7–8 — 3, 5–6 — 2, 3–4 — 14
3 · строки и подписьВерно разложенные строки: 36–40 — 2 балла, 28–35 — 12
4 · подпись вручнуюВерные подписи: 4 — 2 балла, 2–3 — 12
Итого10

Перевод в оценку: 9–10 баллов — «отлично», 7–8 — «хорошо», 5–6 — «удовлетворительно».

§6Как сдать отчёт в GitHub

Отчёт — файл Markdown с именем podpisi_go_Фамилия_Имя.md. В нём фамилия, имя, группа и время сдачи, таблица баллов, темы для повторения и все ответы: порядок команд, раскладка файлов, причины из чата, собранные и написанные подписи.

  1. На вкладке «Рецензия» введите фамилию, имя и группу и нажмите «Скачать отчёт .md».
  2. В своём репозитории дисциплины создайте ветку hw-04 и положите файл в папку lesson_04. Имя файла не меняйте.
  3. Выполните git add lesson_04, затем git commit -m "hw-04: рецензия практикума" и git push -u origin hw-04.
  4. На GitHub откройте Pull Request из hw-04 в свою main. Файл в нём показывается с оформленными таблицами и кодом.

§7Вопросы

Можно ли пройти практикум дома?

Да. Рабочий стол открывается в любом браузере, Go для него не нужен. Работа хранится в том браузере, где её начали: на другом компьютере она не появится. Перед сменой компьютера сдайте работу и скачайте отчёт.

Что будет, если закрыть вкладку?

Ответы сохраняются при каждом изменении и появляются снова при следующем открытии рабочего стола в том же браузере.

Можно ли переделать работу после сдачи?

Нет, после сдачи ответы закрыты. Сбросить работу может только преподаватель — кнопкой «Сбросить работу» с паролем.

Я уже прошёл практикум в ветке Python. Ответы пропадут?

Нет. Ветки хранят работу отдельно: ответы ветки Python остаются на месте, а у ветки Go свой рабочий стол и свой отчёт.

Почему по ходу работы не видно, верно ли решено?

Сверка подписи с заявкой входит в задание. Перевод подписи на русский язык показывает, что записано; совпадает ли это с заявкой, решает студент. Баллы появляются в рецензии после сдачи.

Что повторить перед практикумом?

Для письма 1 — главы 2.1, 2.3, 2.5 и 2.6 в ветке Go: go.mod, go get и go mod tidy, пакеты и запуск, что попадает в Git. В книге темы 02 ветка выбирается кнопкой Python / Go. Для писем 2–4 — справку §3 на этой странице.

МДК.01.01 · практикум «Младший разработчик: первая неделя» · ветка Go Автор: Макаров Максим Николаевич