Menu
Coddy logo textTech

Реализация интерфейса

Часть раздела Логика и управление потоком путешествия по 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 невероятно гибкими. Любой существующий тип может удовлетворять новому интерфейсу, если у него есть необходимые методы, даже если интерфейс был создан после того, как тип был написан.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

В этом испытании вы попрактикуетесь в реализации интерфейса, создав простую систему транспортных средств. Вы создадите структуру Car, которая автоматически реализует интерфейс Vehicle благодаря неявному наследованию в Go.

Вы получите два входных значения:

  • Строку, представляющую марку автомобиля (например, "Toyota")
  • Строку, представляющую скорость автомобиля в км/ч (например, "120")

Ваша задача:

  1. Определить интерфейс Vehicle с одной сигнатурой метода: GetInfo(), который возвращает строку
  2. Определить структуру Car с двумя полями: Brand (string) и Speed (int)
  3. Реализовать метод GetInfo() для структуры Car, который возвращает строку в формате: "Brand: [brand], Speed: [speed] km/h"
  4. Обработать входные данные для создания экземпляра Car
  5. Вызвать метод 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)
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком