Практика: Структуры и интерфейсы
Онлайн редактор кода для Go
Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1: Супергерой с методом представления
Задание 1: Супергерой
Создай структуру Superhero с полями Name, Power и Level. Добавь метод Intro() string, который возвращает эпичное представление героя. Выведи представление нескольких героев.
💡 Подсказка
Объяви структуру с тремя полями.
Добавь метод с value receiver (по значению), возвращающий строку с эмодзи и данными героя.
В main создай несколько экземпляров и вызови метод Intro() для каждого.
После решения основного теста проверь на дополнительных примерах.
Задание 2: Космический корабль с расчётами
Задание 2: Космический корабль
Создай структуру Spaceship с полями Name, Speed (км/с) и Crew. Добавь методы MaxDistance(hours float64) и Info() string. Выведи информацию о корабле и дальность за указанное время.
💡 Подсказка
Метод MaxDistance должен возвращать Speed × hours.
Метод Info — красивую многострочную строку с данными корабля.
В main выведи Info() и результат MaxDistance для заданного времени.
Проверь на дополнительных примерах после решения основного.
Задание 3: Интерфейс Presenter
Задание 3: Универсальное представление
Определи интерфейс Presenter с методом Present() string. Сделай так, чтобы Superhero и Spaceship реализовывали его (используя свои Intro() и Info()). Напиши функцию Introduce(p Presenter) и выведи представление нескольких объектов через слайс []Presenter.
💡 Подсказка
Интерфейс Presenter содержит только один метод Present() string.
Для Superhero Present() вызывает Intro(), для Spaceship — Info().
Функция Introduce принимает интерфейс и вызывает Present().
Создай слайс []Presenter с героями и кораблями и перебирай его.
Задание 4: Min Stack
Задание 4: Стек с операцией min (L)
Реализуй структуру MinStack, которая поддерживает операции push, pop, top и getMin (возвращает текущий минимум). Все операции должны работать за O(1). В main продемонстрируй последовательность операций.
💡 Подсказка
Структура MinStack должна хранить элементы и поддерживать быстрый доступ к минимуму.
Один из способов — использовать два слайса: один для значений, второй только для минимумов.
Другой — хранить в одном слайсе пары (значение, текущий_минимум).
Все операции (push, pop, top, getMin) должны быть O(1).
После решения основного теста проверь на дополнительных примерах.
Задание 5: Животные говорят
Задание 5: Звуки животных
Определи интерфейс Speaker с методом Speak() string. Создай структуры Dog, Cat, Cow (и другие). Реализуй Speak() для каждого. Напиши функцию MakeThemSpeak(speakers ...Speaker), которая выводит речь всех животных.
💡 Подсказка
Интерфейс Speaker содержит только метод Speak() string.
Каждое животное — отдельная структура с методом Speak(), возвращающим звук с эмодзи.
Функция MakeThemSpeak принимает variadic параметр ...Speaker.
В main создай слайс животных и передай в функцию.
Задание 6: Таймер миссии
Задание 6: Таймер миссии
Создай структуру MissionTimer с полем Seconds. Добавь методы Tick() (уменьшает на 1), IsOver() bool и Status() string. В main симулируй обратный отсчёт с выводом статуса каждую секунду (используй time.Sleep).
💡 Подсказка
Tick() уменьшает Seconds на 1.
IsOver() возвращает true, если Seconds ≤ 0.
Status() возвращает строку в зависимости от состояния.
В main используй цикл while !timer.IsOver(), внутри Tick() и time.Sleep(time.Second).
Задание 7: Implement Queue using Stacks
Задание 7: Очередь на двух стеках (L)
Реализуй структуру MyQueue с операциями push, pop, peek и empty, используя только два стека (слайса). Очередь должна работать по принципу FIFO.
💡 Подсказка
Используй два слайса: один для входа (inStack), второй для выхода (outStack).
При push — добавляй в inStack.
При pop/peek — если outStack пуст, перелей всё из inStack в outStack (в обратном порядке).
empty() — проверяй оба стека.
Проверь на дополнительных примерах после решения основного.
Задание 8: Красивый вывод через Stringer
Задание 8: Переопределение String()
Для всех созданных структур (Superhero, Spaceship, MissionTimer и другие) добавь метод String() string. Теперь fmt.Println(объект) будет выводить красивое описание вместо стандартного.
💡 Подсказка
Метод String() должен возвращать string и иметь receiver по значению или указателю.
Используй fmt.Sprintf для форматирования с эмодзи и данными.
После добавления метода просто fmt.Println(объект) покажет красивое представление.
Это работает с %v, %+v, %s и обычным Println.
Дополнительные материалы
- Добавь встраивание (embedding) в структуры
- Создай больше интерфейсов (например, Movable, Fightable)
- Поиграйся с type switch для разных типов
- Реализуй композицию вместо наследования
Интерфейсы в Go — это суперсила полиморфизма. Пиши код под интерфейсы, а не под конкретные типы — и твой код станет гибким и тестируемым!
Пакеты, модули и работа с ошибками.