Реализация интерфейса
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 14 из 68.
Теперь, когда вы знаете, как определять интерфейс, давайте узнаем, как типы Go на самом деле их реализуют. Самое важное, что нужно понять, это то, что Go использует неявную реализацию — для этого не требуется никаких специальных ключевых слов или объявлений.
Если тип обладает всеми методами, которые требует интерфейс, он автоматически удовлетворяет этому интерфейсу. Вам не нужно явно указывать, что ваш тип реализует интерфейс — Go определяет это самостоятельно.
Вот как это работает с интерфейсом Shaper из предыдущего урока:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Поскольку тип Circle имеет метод Area(), который возвращает float64, он автоматически реализует интерфейс Shaper. Нет необходимости объявлять эту связь явно — Go распознает её на основе соответствия сигнатуры метода.
Этот неявный подход делает интерфейсы Go невероятно гибкими. Любой существующий тип может удовлетворять новому интерфейсу, если у него есть необходимые методы, даже если интерфейс был создан после того, как тип был написан.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВ этом испытании вы попрактикуетесь в реализации интерфейса, создав простую систему транспортных средств. Вы создадите структуру Car, которая автоматически реализует интерфейс Vehicle благодаря неявному наследованию в Go.
Вы получите два входных значения:
- Строку, представляющую марку автомобиля (например,
"Toyota") - Строку, представляющую скорость автомобиля в км/ч (например,
"120")
Ваша задача:
- Определить интерфейс
Vehicleс одной сигнатурой метода:GetInfo(), который возвращает строку - Определить структуру
Carс двумя полями:Brand(string) иSpeed(int) - Реализовать метод
GetInfo()для структурыCar, который возвращает строку в формате:"Brand: [brand], Speed: [speed] km/h" - Обработать входные данные для создания экземпляра
Car - Вызвать метод
GetInfo()и вывести результат
Помните, что в Go структура Car автоматически реализует интерфейс Vehicle, так как она имеет необходимый метод GetInfo() с правильной сигнатурой. Нет необходимости явно объявлять, что Car реализует Vehicle — Go распознает эту связь неявно.
Шпаргалка
Go использует неявную реализацию интерфейсов — никакие специальные ключевые слова или объявления не требуются.
Если тип обладает всеми методами, которые требует интерфейс, он автоматически удовлетворяет этому интерфейсу:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Поскольку Circle имеет метод Area(), возвращающий float64, он автоматически реализует интерфейс Shaper без явного объявления.
Этот неявный подход делает интерфейсы Go гибкими — любой существующий тип может удовлетворять новому интерфейсу, если у него есть необходимые методы, даже если интерфейс был создан после самого типа.
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
// TODO: 1. Определите интерфейс Vehicle с методом GetInfo() string
// TODO: 2. Определите структуру Car с полями Brand (string) и Speed (int)
// TODO: 3. Реализуйте метод GetInfo() для Car
func main() {
// Чтение входных данных
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// Преобразование строки скорости в целое число
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. Создайте экземпляр Car, используя brand и speed, затем вызовите GetInfo()
result := "" // замените эту строку вашей реализацией
_ = brand
_ = speed
// Вывод результата
fmt.Println(result)
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение