Повторение: Калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 33 из 107.
Задание
ЛегкоДавайте создадим калькулятор фигур, который объединит все концепции интерфейсов из этой главы. Вы создадите систему, в которой различные геометрические фигуры могут обрабатываться единообразно через общий интерфейс, демонстрируя мощь полиморфизма в Go.
Вы распределите свой код по трем файлам:
shape.go: Определите интерфейсShapeс двумя методами:Area() float64иPerimeter() float64. Также создайте функцию с именемDescribeShape, которая принимает любойShapeи возвращает отформатированную строку, показывающую как его площадь, так и периметр.shapes.go: Создайте две структуры, реализующие интерфейсShape:Rectangleс полямиWidthиHeightCircleс полемRadius
Area()иPerimeter(), а также методString()(реализующий интерфейсfmt.Stringer), который возвращает читаемое описание фигуры.main.go: Считайте данные о фигурах из входного потока, создайте соответствующие фигуры и используйте функциюDescribeShapeдля отображения информации о каждой из них. Также выведите каждую фигуру напрямую, чтобы продемонстрировать работу интерфейсаStringer.
Будут предоставлены следующие входные данные:
- Строка 1: Ширина прямоугольника (float)
- Строка 2: Высота прямоугольника (float)
- Строка 3: Радиус круга (float)
Для вычислений используйте 3.14159 в качестве значения числа пи. Периметр круга вычисляется как 2 * pi * radius.
Ваши методы String() должны возвращать:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
Ваша функция DescribeShape должна возвращать:
Area: [area], Perimeter: [perimeter]Форматируйте все значения с плавающей точкой с двумя знаками после запятой, используя %.2f.
Например, для входных данных 4, 3 и 5 ваш вывод должен быть следующим:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Сначала выведите саму фигуру (используя её метод String()), а затем её описание из DescribeShape. Сначала обработайте прямоугольник, затем круг.
Попробуйте сами
package main
import (
"fmt"
)
func main() {
// Считать входные значения
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Создать Rectangle с заданными width и height
// TODO: Создать Circle с заданным radius
// TODO: Вывести rectangle (использует метод String())
// TODO: Вывести описание rectangle, используя DescribeShape()
// TODO: Вывести circle (использует метод String())
// TODO: Вывести описание circle, используя DescribeShape()
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker Pool