Перейти к основному содержимому

Практика: Структуры и интерфейсы


Онлайн редактор кода для 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 — это суперсила полиморфизма. Пиши код под интерфейсы, а не под конкретные типы — и твой код станет гибким и тестируемым!

Следующий урок

Пакеты, модули и работа с ошибками.