Назад к вопросам
Junior
150
questionbank

Как сообщить компилятору, что наш тип реализует интерфейс?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Go реализация интерфейса неявная. Компилятору достаточно, чтобы тип имел все методы, объявленные в интерфейсе, с совпадающей сигнатурой.

Пример:

package main

import "fmt"

// Интерфейс Shape имеет один метод Area
type Shape interface {
	Area() float64
}

// Структура Circle
type Circle struct {
	Radius float64
}

// Метод Area для типа Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

// Структура Rectangle
type Rectangle struct {
	Width, Height float64
}

// Метод Area для типа Rectangle
func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

func main() {
	// Circle и Rectangle неявно реализуют интерфейс Shape,
	// поскольку у них есть метод Area() float64
	var s Shape
	
	s = Circle{Radius: 5} // Присваивание экземпляра Circle переменной типа Shape
	fmt.Printf("Area of circle: %f\n", s.Area())

	s = Rectangle{Width: 4, Height: 6} // Присваивание экземпляра Rectangle переменной типа Shape
	fmt.Printf("Area of rectangle: %f\n", s.Area())
}

Иногда для явной проверки реализации на этапе компиляции используется конструкция var _ InterfaceType = ConcreteType{}. Если ConcreteType не реализует InterfaceType, компилятор выдаст ошибку.

// Проверка реализации интерфейса Shape типом Circle на этапе компиляции
var _ Shape = Circle{} 

// Проверка реализации интерфейса Shape типом Rectangle на этапе компиляции
var _ Shape = Rectangle{}